设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3030|回复: 3

爬虫——urllib爬虫模块

  [复制链接]

17

主题

120

金钱

200

积分

入门用户

发表于 2019-9-5 14:56:00 | 显示全部楼层 |阅读模式

  网络爬虫也称为网络蜘蛛、网络机器人,抓取网络的数据。其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好。一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务所需数据。而数据来源可以来自于公司内部数据,第三方平台购买的数据,还可以通过网络爬虫爬取数据。python在网络爬虫方向上有着成熟的请求、解析模块,以及强大的Scrapy网络爬虫框架。

爬虫分类
1、通用网络爬虫:搜索引擎使用,遵守robots协议(君子协议)
  robots协议 :网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。https://www.taobao.com/robots.txt
2、聚焦网络爬虫 :自己写的爬虫程序

爬虫爬取数据步骤
1、确定需要爬取的URL地址
2、由请求模块向URL地址发出请求,并得到网站的响应
3、从响应内容中提取所需数据
    1、所需数据,保存
    2、页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环

请求模块
from urllib import request
request.urlopen()  向网站发起请求并获取响应对象

参数:
URL:需要爬取的URL地址
timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常

响应对象(response)方法
string = response.read().decode('utf-8')  获取响应对象内容(网页源代码),返回内容为字节串bytes类型,顺便需要decode转换成string。
url = response.geturl()      返回实际数据的URL地址
code = response.getcode()     返回HTTP响应码

  1. from urllib import request
  2. url = 'http://www.baidu.com/'

  3. # 向百度发请求,得到响应对象
  4. response = request.urlopen(url)

  5. # 返回网页源代码
  6. print(response.read().decode('utf-8'))

  7. # 返回http响应码
  8. print(response.getcode())       # 200
  9. # 返回实际数据URL地址
  10. print(response.geturl())        # http://www.baidu.com/
复制代码

urllib.request.Request()  创建请求对象(包装请求,重构User-Agent,使程序更像正常人类请求)

参数
URL:请求的URL地址
headers:添加请求头(爬虫和反爬虫斗争的第一步)

使用流程
1、创建请求对象(重构User-Agent)
  req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})
2、请求对象发起请求,获取响应对象(urlopen)
  res = urllib.request.urlopen(req)
3、通过相应对象获取响应内容
  html = res.read().decode('utf-8')
  1. from urllib import request

  2. url = 'http://httpbin.org/get'
  3. headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}

  4. # 创建请求对象(包装请求)
  5. req = request.Request(url=url,headers=headers)
  6. # 发请求,获取响应对象
  7. res = request.urlopen(req)
  8. # 读取内容,返回网页代码
  9. html = res.read().decode('utf-8')

  10. print(html)
复制代码



URL地址编码
urllib.parse.urlencode({dict})
URL地址中一个查询参数

查询参数:{'wd' : '美女'}

urlencode编码后:'wd=%e7%be%8e%e5%a5%b3'
  1. from urllib import parse

  2. url = 'http://www.baidu.com/s?'

  3. query_string = parse.urlencode({'wd':'美女'})
  4. print(query_string)         # wd=%E7%BE%8E%E5%A5%B3
  5. url = url + query_string
  6. # http://www.baidu.com/wd=%E7%BE%8E%E5%A5%B3
复制代码


URL地址中多个查询参数
  1. from urllib import parse
  2. query_string_dict = {'wd' : '美女',
  3.                     'pn' : '50'}
  4. query_string = parse.urlencode(query_string_dict)
  5. url = 'http://www.baidu.com/s?{}'.format(query_string)
  6. print(url)
  7. # http://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&pn=50
复制代码


拼接URL地址的3种方式
1、字符串相加
'https://www.baidu.com/s?' + urlencode({'wd':'美女','pn':'50'})
2、字符串格式化(占位符)
'https://www.baidu.com/s?%s' % urlencode({'wd':'美女','pn':'50'})
3、format()方法
  'https://www.baidu.com/s?{}'.format(urlencode({'wd':'美女','pn':'50'}))

示例 在百度中输入要搜索的内容,把响应内容保存到本地文件
  1. from urllib import request
  2. from urllib import parse

  3. # 定义常用变量
  4. word = input('请输入搜索内容:')
  5. url = 'http://www.baidu.com/s?'
  6. headers = {'User-Agent':'Mozilla/5.0'}

  7. # url编码,拼接完整URL
  8. query_string = parse.urlencode({'wd':word})
  9. url = url + query_string

  10. # 三步走
  11. req = request.Request(url=url,headers=headers)
  12. res = request.urlopen(req)
  13. html = res.read().decode('utf-8')

  14. filename = '{}.html'.format(word)
  15. with open(filename,'w',encoding='utf-8') as f:
  16.     f.write(html)
复制代码


urllib.parse.quote(string)编码
  1. from urllib import parse
  2. parse.quote('美女')       # %E7%BE%8E%E5%A5%B3
复制代码

urllib.parse.unquote(string)解码
  1. from urllib import parse

  2. result = parse.unquote('%E7%BE%8E%E5%A5%B3')
  3. print(result)       # 美女
复制代码


百度贴吧网页获取
1.输入贴吧名称
2.输入起始页
3.输入终止页
4.保存到本地文件:第1页.html、第2页.html ...

实现步骤
1、找URL规律
     1、不同吧
     2、不同页
          第1页:http://tieba.baidu.com/f?kw=????&pn=0
          第2页:http://tieba.baidu.com/f?kw=????&pn=50
          第n页:pn=(n-1)*50

2、获取网页内容
3、保存(本地文件、数据库)
  1. from urllib import request,parse
  2. import time
  3. import random

  4. class BaiduSpider(object):
  5.     def __init__(self):
  6.         self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
  7.         self.headers = {'User-Agent':'Mozilla/5.0'}

  8.     # 获取响应
  9.     def get_page(self,url):
  10.         req = request.Request(url=url,headers=self.headers)
  11.         res = request.urlopen(req)
  12.         html = res.read().decode('utf-8')
  13.         return html

  14.     # 保存数据
  15.     def write_page(self,filename,html):
  16.         with open(filename,'w') as f:
  17.             f.write(html)

  18.     # 主函数
  19.     def main(self):
  20.         name = input('请输入贴吧名:')
  21.         start = int(input('请输入起始页:'))
  22.         end = int(input('请输入终止页:'))

  23.         # 拼接URL地址,发请求
  24.         for page in range(start,end+1):
  25.             pn = (page-1)*50
  26.             kw = parse.quote(name)          # url编码
  27.             url = self.url.format(kw,pn)
  28.             html = self.get_page(url)       # 获取响应,并保存
  29.             filename = '{}-第{}页.html'.format(name,page)
  30.             self.write_page(filename,html)
  31.             print('第{}页爬取成功'.format(page))  # 提示进度
  32.             time.sleep(random.randint(1,3))     # 控制爬取速度

  33. if __name__ == '__main__':
  34.     spider = BaiduSpider()
  35.     spider.main()
复制代码


7

主题

362

金钱

3127

积分

中级用户

发表于 2020-1-2 20:25:06 | 显示全部楼层
ximenyan
回复

使用道具 举报

7

主题

362

金钱

3127

积分

中级用户

发表于 2020-1-2 20:25:27 | 显示全部楼层
赞一个,有才!
ximenyan
回复 支持 反对

使用道具 举报

0

主题

2

金钱

11

积分

新手用户

发表于 2020-12-26 09:01:28 | 显示全部楼层
爬虫爬取数据步骤
1、确定需要爬取的URL地址
2、由请求模块向URL地址发出请求,并得到网站的响应
3、从响应内容中提取所需数据
    1、所需数据,保存
    2、页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表