爬虫

1 requests.post(
2     url='',
3     params={'k1':'v1','k2':'v2'},
4     cookies={},
5     headers={},
6     data={},
7     json={},
8 )
9 #data和json都是传送数据,跟请求头需要一直,默认是跟data一组,需要json传送,headers={‘content-type’:'application/json'}

爬虫入门

urlib基本使用和进阶

 web 微信

  -轮询  定时几秒刷新一次(client不停地发)

  -长轮询  hang助请求,无消息,超时断开,客户端以及发请求 (比如web微信qq)

            有消息,立即返回 (http协议)  

  -websocket

爬虫框架scrapy 

  关于安装

  Linux

      pip3 install scrapy
   Windows
      a. pip3 install wheel  python3的依赖库
      b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted  python3 scrapy的依赖库
      c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl  (注意版本号其中的35就是python3.5需要跟自己的一起,还有就是操作系统)
      d. pip3 install scrapy
      e. 下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/

3、运行

进入project_name目录,运行命令

scrapy crawl spider_name(爬虫名name) --nolog (不显示日志)

注意scrapy url去重request(dont_filter=True)

 

爬虫.py前
import sys,os sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') #解决编码问题(response.content二进制-responbse.text(字符)不能正常显示)

选择器

  

  Request是一个封装用户请求的类,在回调函数中yield该对象表示继续访问

  HtmlXpathSelector用于结构化HTML代码并提供选择器功能  已被弃用(目前用Selector)

    hxs = Selector(response)   #selector中extract()提取出的是list类型,extract_first()提取出的是unicode类型

  link_id_list = hxs.xpath('//a’).extract() #extract()提取,不然是个对象
   xpath语法 //a 表示当前文档中的后代a标签 (//开始就是冲整个文档开始, /表示儿子代)
      //a[2]当前文档中的所有a标签索引位2的哪一个 同理[@id]表示包换属性id (属性前面必须有@)
      //a[@id="i1"] 也可以赋值
      BigNode/Node[last()] //取出BigNode路径下最后一个Node节点
      Node[not(@class)] //不含class属性的node节点
      Node[contains(text(),a)] //文本包含字符串a的node节点
      Node[count(span)=2] //包含两个span节点的node节点
      Node.xpath('string(.)')//提取出Node节点下除去标签的所有文本
      hxs).xpath('//a[re:test(@id, "i\d+")]/@href').extract() #正则固定格式(匹配a标签下的id是i加数字的,获取他的href属性)
 
 1 import asyncio #python3.3以后引入的异步

 3 
 4 @asyncio.coroutine
 5 def fetch_async(host, url='/'):
 6     print(host, url)
 7     reader, writer = yield from asyncio.open_connection(host, 80) #打开连接
 8 
 9     request_header_content = """GET %s HTTP/1.0\r\nHost: %s\r\n\r\n""请求体" % (url, host,) #仿制请求头
10     request_header_content = bytes(request_header_content, encoding='utf-8')
11 
12     writer.write(request_header_content)
13     yield from writer.drain() #发送数据
14     text = yield from reader.read() #接受response等,这里是接受reader.read()返回值
15     print(host, url, text)
16     writer.close()
17 
18 tasks = [ #添加任务
19     fetch_async('www.cnblogs.com', '/wupeiqi/'),
20     fetch_async('dig.chouti.com', '/pic/show?nid=4073644713430508&lid=10273091')
21 ]
22 
23 loop = asyncio.get_event_loop()
24 results = loop.run_until_complete(asyncio.gather(*tasks))
25 loop.close()

 

 

 1 import gevent
 2 
 3 import requests
 4 from gevent import monkey
 5 
 6 monkey.patch_all()  #内部socket装换了gevent.socket,(set blocking = Fale变成非阻塞)
 7 
 8 
 9 def fetch_async(method, url, req_kwargs):
10     print(method, url, req_kwargs)
11     response = requests.request(method=method, url=url, **req_kwargs)
12     print(response.url, response.content)
13 
14 # ##### 发送请求 #####
15 gevent.joinall([
16     gevent.spawn(fetch_async, method='get', url='https://www.python.org/', req_kwargs={}),
17     gevent.spawn(fetch_async, method='get', url='https://www.yahoo.com/', req_kwargs={}),
18     gevent.spawn(fetch_async, method='get', url='https://github.com/', req_kwargs={}),
19 ])
20 
21 # ##### 发送请求(协程池控制最大协程数量) #####
22 # from gevent.pool import Pool
23 # pool = Pool(None)
24 # gevent.joinall([
25 #     pool.spawn(fetch_async, method='get', url='https://www.python.org/', req_kwargs={}),
26 #     pool.spawn(fetch_async, method='get', url='https://www.yahoo.com/', req_kwargs={}),
27 #     pool.spawn(fetch_async, method='get', url='https://www.github.com/', req_kwargs={}),
28 # ])
29 
30 4.gevent + requests
View Code

 

 备注 异步非阻塞 优先twisted >gevent+requests>asynio+requests连接地址 http://www.cnblogs.com/wupeiqi/articles/6229292.html

 

scrapy默认使用 scrapy.dupefilter.RFPDupeFilter 进行去重,相关配置有:

  DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter' #可以自定制(DUPEFILTER_CLASS = 'scrapy.自定义的模块') 参考原模块

  DUPEFILTER_DEBUG = False  #下面两个配合使用,记录日志
  JOBDIR = "保存范文记录的日志路径,如:/root/"  # 最终路径为 /root/requests.seen


posted @ 2018-03-31 20:31  coding天荒地老  阅读(246)  评论(0编辑  收藏  举报