最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据、解析数据、保存数据。下面一一来讲。

1.下载数据

首先打开要爬的网站,分析URL,每打开一个网页看URL有什么变化,有可能带上上个网页的某个数据,例如xxID之类,那么我们就需要在上一个页面分析HTML,找到对应的数据。如果网页源码找不到,可能是ajax异步加载,去xhr里去找。

有的网站做了反爬的处理,可以添加User-Agent :判断浏览器

1

2

3

self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

# 初始化 headers

self.headers = {'User-Agent': self.user_agent}

如果不行,在Chrome上按F12分析请求头、请求体,看需不需要添加别的信息,例如有的网址添加了referer:记住当前网页的来源,那么我们在请求的时候就可以带上。按Ctrl + Shift + C,可以定位元素在HTML上的位置

动态网页

有一些网页是动态网页,我们得到网页的时候,数据还没请求到呢,当然什么都提取不出来,用Python 解决这个问题只有两种途径:直接从JavaScript 代码里采集内容,或者用Python 的第三方库运行JavaScript,直接采集你在浏览器里看到的页面。

1.找请求,看返回的内容,网页的内容可能就在这里。然后可以复制请求,复杂的网址中,有些乱七八糟的可以删除,有意义的部分保留。切记删除一小部分后先尝试能不能打开网页,如果成功再删减,直到不能删减。

2.Selenium:是一个强大的网络数据采集工具(但是速度慢),其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium 库是一个在WebDriver 上调用的API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。

PhantomJS:是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的JavaScript,但是它不会向用户展示网页的图形界面。把Selenium和PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,可以处理cookie、JavaScript、header,以及任何你需要做的事情。

下载数据的模块有urllib、urllib2及Requests

Requests相比其他俩个的话,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码,而且api相对来说也简单,但是requests直接使用不能异步调用,速度慢。

1

html = requests.get(url, headers=headers)   #没错,就是这么简单

  

urllib2以我爬取淘宝的妹子例子来说明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

headers = {'User-Agent': user_agent}

# 注意:form data请求参数

params 'q&viewFlag=A&sortType=default&searchStyle=&searchRegion=city%3A&searchFansNum=&currentPage=1&pageSize=100'

def getHome():

    url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'

    req = urllib2.Request(url, headers=headers)

    # decode(’utf - 8’)解码   把其他编码转换成unicode编码

    # encode(’gbk’) 编码  把unicode编码转换成其他编码

    # ”gbk”.decode(’gbk’).encode(’utf - 8')

    # unicode = 中文

    # gbk = 英文

    # utf - 8 = 日文

    # 英文一 > 中文一 > 日文,unicode相当于转化器

    html = urllib2.urlopen(req, data=params).read().decode('gbk').encode('utf-8')

    # json转对象

    peoples = json.loads(html)

    for in peoples['data']['searchDOList']:

        #去下一个页面获取数据

        getUseInfo(i['userId'], i['realName'])

  

2.解析数据

解析数据也有很多方式,我只看了beautifulsoup和正则,这个例子是用正则来解析的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def getUseInfo(userId, realName):

    url = 'https://mm.taobao.com/self/aiShow.htm?userId=' + str(userId)

    req = urllib2.Request(url)

    html = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')

    pattern = re.compile('<img.*?src=(.*?)/>', re.S)

    items = re.findall(pattern, html)

    x = 0

    for item in items:

        if re.match(r'.*(.jpg")$', item.strip()):

            tt = 'http:' + re.split('"', item.strip())[1]

            down_image(tt, x, realName)

            x = x + 1

    print('下载完毕')

  

正则表达式说明

match:匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。
search:在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。
findall:在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配

2)(.*?)代表一个分组,如果有5个(.*?)就说明匹配了五个分组

3) 正则表达式中,“.”的作用是匹配除“\n”以外的任何字符,也就是说,它是在一行中进行匹配。这里的“行”是以“\n”进行区分的。HTML标签每行的末尾有一个“\n”,不过它不可见。 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

3.保存数据

数据解析后可以保存到文件或数据库中,这个例子是保存到了文件中,很简单,就不做说明了,在下篇讲如何将数据保存到数据库

Python用Django写restful api接口 - 梦和远方 - 博客园

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def down_image(url, filename, realName):

    req = urllib2.Request(url=url)

    folder = 'e:\\images\\%s' % realName

    if os.path.isdir(folder):

        pass

    else:

        os.makedirs(folder)

    f = folder + '\\%s.jpg' % filename

    if not os.path.isfile(f):

        print f

        binary_data = urllib2.urlopen(req).read()

        with open(f, 'wb'as temp_file:

            temp_file.write(binary_data)

  

GitHub地址,还有其他网站爬虫,欢迎star:GitHub - peiniwan/Spider2: Python爬虫和练习

网站爬虫Python相关推荐

  1. python爬虫小说代码示例-中文编程,用python编写小说网站爬虫

    原标题:中文编程,用python编写小说网站爬虫 作者:乘风龙王 原文:https://zhuanlan.zhihu.com/p/51309019 为保持源码格式, 转载时使用了截图. 原文中的源码块 ...

  2. 基于python的网站_基于Python的网站爬虫应用研究

    基于 Python 的网站爬虫应用研究 陈清 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2020(027)001 [摘要] 如何于海量的互联网网站中获取有用资源信息 , 对网站 ...

  3. python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)

    本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...

  4. 基于Python的招聘网站爬虫及可视化的设计与实现

    摘 要 I Abstract II 引 言 1 第1章 课题概述 2 1.1 课题内容 2 1.2 课题背景 2 1.3 课题意义 3 1.4 运行环境 3 1.5 相关技术 3 1.5.1 Pyth ...

  5. python爬小说代码_中文编程,用python编写小说网站爬虫

    原标题:中文编程,用python编写小说网站爬虫 作者:乘风龙王 原文:https://zhuanlan.zhihu.com/p/51309019 为保持源码格式, 转载时使用了截图. 原文中的源码块 ...

  6. python 爬虫 微博 github_GitHub 热门:各大网站的 Python 爬虫登录汇总

    原标题:GitHub 热门:各大网站的 Python 爬虫登录汇总 (给数据分析与开发加星标,提升数据技能) 转自:机器之心,GitHub 作者:CriseLYJ 不论是自然语言处理还是计算机视觉,做 ...

  7. 【基于Python的招聘网站爬虫及可视化的设计与实现】

    完整下载:基于Python的招聘网站爬虫及可视化的设计与实现.docx 目录 目录 2 摘要 3 关键词 3 第一章 绪论 3 1.1 研究背景 3 1.2 研究意义 4 1.3 研究目的 6 1.4 ...

  8. 使用Python打造基本WEB漏洞扫描器(一) 网站爬虫+SQL注入检测

    一.实验介绍 扫描器需要实现功能的思维导图: 1.1 实验内容 编写一个简单的多线程爬虫,用于对网站地址进行爬取,编写一个简单的sql注入工具,用于对网站地址进行sql注入的检测. 1.2 实验知识点 ...

  9. python简单网站爬虫-爬取北京7天最高、最低气温

    python简单网站爬虫-爬取北京7天最高.最低气温 前置操作: 1.待爬取网站: 北京天气的网址: http://www.weather.com.cn/weather1d/101010100.sht ...

  10. 阿里巴巴python招聘_python阿里巴巴招聘网站爬虫

    写了个阿里巴巴招聘网站爬虫,这次是存在csv文件里,小伙伴们可以对比一下- import requests,json,csv #写入csv文件中 list=[] csv_file=open('阿里巴巴 ...

最新文章

  1. 首款VR全身触控体验套件Teslasuit,让你浑身“来电”
  2. 计算机在中职教育中的运用论文,中职计算机教育的相关论文(2)
  3. nginx php-fpm调优
  4. 使用Convirt 2.0.1管理虚拟机环境
  5. vs2015 QT5.6 兼容xp系统
  6. initialization of 'XXX' is skipped by 'case' label
  7. 自用Excel VBA技巧整理
  8. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.6 为克隆使用序列化
  9. HDU 5673 Robot 卡特兰数
  10. mysql的数据类型5---enum与set类型
  11. win10重新安装应用商店
  12. c语言盗取qq号程序,C++获取本机登陆过的QQ号码示例程序
  13. 全员营销实施困难,是因为你没有这个神器
  14. 2022焊工(初级)考试题库及答案
  15. python测试用例设计方法_功能测试用例设计方法分享
  16. 用eclipse europa开发web service服务 - 东写西读终见大海无量 - JavaEye技术网站
  17. Java中Ascall码的使用
  18. 2022-4-28作业
  19. vscode配置Go支持
  20. RPG冒险类游戏:矮人The Dwarves for Mac中文版(支持m1)

热门文章

  1. Android Monkey Test
  2. Unity3D 资源加载 Resources.Load
  3. java实现dex转jar_dex转jar工具
  4. 扫雷游戏代码html,分享一个用h5制作的网页版扫雷游戏实例代码
  5. C语言编程100题(基础知识、基本结构、数组)
  6. 中望cad linux版本,中望CAD2021下载 中望CAD ZWCAD 2021 For Linux v5.0.1446 官方正式版(支持国产UOS系统) 下载-脚本之家...
  7. 基于python的科比职业生涯命中率分析
  8. 解决:xml文件单行注释、多行注释问题
  9. iphone6主板注释
  10. 如何设置打印机双面打印?