Twisted安装不成功解决办法:把Twisted-17.1.0-cp36-cp36m-win_amd64.whl改为Twisted-17.1.0-py36-none-any.whl然后再进行安装。
Scrapy是一个大而全的爬虫组件;
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
一、Scrapy的安装
window:
a. pip3 install wheel b. 下载twisted
c. cmd切换到Twisted目录,执行 pip3 install Twisted‑17.1.0‑py36‑none-any.whl d. pip3 install scrapy
二、Scrapy的基本使用
1、新建一个文件day125:C:Pythonzhday125, 切换至此目录下
2、创建project
cmd创建一个project,名称为xdb ---在cmd中:
C:Pythonzhday125>scrapy startproject xdb
执行上面命令后在day125中会自动生成一个名为xdb的项目,里面有两个文件:
xdb文件中:
文件说明:
- spiders 爬虫目录,如:创建文件,编写爬虫规则
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- middlewares.py 中间件
- pipelines 数据处理行为,如:一般结构化的数据持久化
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等
3、创建爬虫项目:
切换至xdb目录下,在cmd中:
C:Pythonzhday125xdb>scrapy genspider chouti chouti.com
打开chouti.py:
#chouti.py import scrapy class ChoutiSpider(scrapy.Spider): name = 'chouti' allowed_domains = ['chouti.com'] start_urls = ['http://chouti.com/'] def parse(self, response): pass
4、启动爬虫
scrapy crawl chouti
三、scrapy示例:获取抽屉新闻
为了操作方便,在pycharm找到xdb项目并打开
chouti.py
在cmd中启动项目:
--nolog表示不打印日志。
-----------------------------------------------------------------------------------
爬取chouti新闻时:
chouti.py
import scrapy from scrapy.http.response.html import HtmlResponse # import sys,os,io # sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') #如果项目启动出错可以开打上面两条命令 class ChoutiSpider(scrapy.Spider): name = 'chouti' allowed_domains = ['chouti.com'] start_urls = ['http://chouti.com/'] def parse(self, response): # print(response,type(response)) # 对象 # print(response.text) """ from bs4 import BeautifulSoup soup = BeautifulSoup(response.text,'html.parser') content_list = soup.find('div',attrs={'id':'content-list'}) """ # xpath:帮助我们找标签,它是HTML内置的解析器 # //表示去当前html子孙中找div并且id=content-list # /表示去儿子里面去找div标签 f = open('news.log', mode='a+') #打开一个文件,a+:追加 item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]') for item in item_list: text = item.xpath('.//a/text()').extract_first() #取第一个a标签的文本内存 href = item.xpath('.//a/@href').extract_first() #取第一个a标签的属性 print(href,text.strip()) f.write(href+' ') #写入爬取的内容 f.close() #上面写入的是第一页的数据,还需要跳转到第二页、第三页写入第二页数据 #找到分页的所有页面 page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract() for page in page_list: from scrapy.http import Request page = "https://dig.chouti.com" + page yield Request(url=page,callback=self.parse) # https://dig.chouti.com/all/hot/recent/2 #通过yield Request()告诉scrapy再次向指定的url发起请求
其它:

""" """ # 原来 """ import requests url_list = ['http://www.baidu.com', 'http://www.baidu.com', 'http://www.baidu.com', ] for item in url_list: response = requests.get(item) print(response.text) """ # 现在 """ 非阻塞,不等待; 我向贝贝、高件套、小东北发起连接请求时候,不等连接再去连下一个,而是发送一个只会,马上发送下一个。 import socket sk = socket.socket() sk.setblocking(False) sk.connect((1.1.1.1,80)) import socket sk = socket.socket() sk.setblocking(False) sk.connect((1.1.1.2,80)) import socket sk = socket.socket() sk.setblocking(False) sk.connect((1.1.1.3,80)) 异步,回调; 我帮助龙泰、呼呼、刘淞找到想要的人只会,我会主动通知他们。 def callback(contents): print(contents) 事件循环; 我,我一直在循环三个socket任务(即:贝贝、高件套、小东北),检查他三个状态:是否连接成功;是否返回结果。 总结: 官方:基于事件循环的异步非阻塞模块。 白话:一个线程同时可以向多个目标发起Http请求。 """ from twisted.web.client import getPage, defer from twisted.internet import reactor # 第一部分:代理开始接收任务 def callback(contents): print(contents) deferred_list = [] # [(龙泰,贝贝),(刘淞,宝件套),(呼呼,东北)] url_list = ['http://www.bing.com', 'https://segmentfault.com/','https://stackoverflow.com/' ] for url in url_list: deferred = getPage(bytes(url, encoding='utf8')) # (我,要谁) deferred.addCallback(callback) deferred_list.append(deferred) # # 第二部分:代理执行完任务后,停止 dlist = defer.DeferredList(deferred_list) def all_done(arg): reactor.stop() dlist.addBoth(all_done) # 第三部分:代理开始去处理吧 reactor.run()