day06
1.多线程爬虫
- 多进程线程应用场景
- 多进程:大量密集并进行计算
- 多线程:I/O密集(网络I/O,本地磁盘I/O)
- 多线程爬虫
- URL队列:put(url)
- RES队列:从URL队列中get()发请求,put(html)
- 创建多个RES线程,发请求获取html
- 创建多个解析线程,解析html
2.BeautifulSoup:HTML/XML解析库
- 使用流程
- 导入模块:from bs4 import BeautifulSoup as bs
- 创建对象:soup.bs(html,'1xml')
- 查找节点:soup.find_all(id='test')
- 支持解析库
- lxml:快,文档容错力强
- html.parser:一般
- xml:快,文档容错力强
- 常用方法
- find_all():列表
- r_list = soup.find_all(class_="test")
- r_list = soup.find_all("div",attrs={"class","a"})
- 节点对象方法
- get_text()
- string
- find_all():列表
3.scrapy框架
- 异步处理框架
- 组成
Engine ,Scheduler ,Downloader ,Spider ,Item Pipeline ,Downloader Middlewares ,Spider Middlewares - 运行流程
- Engine开始统揽全局,向spider索要URL
- Engine拿到url后,给Scheduler入队列
- Schduler从队列中拿出url给Engine,通过Downloader Middlewares 给Downloader去下载
- Downloader下载完成,把response给Engine
- Engine把response通过Spider Middlewares 给Spider
- Spider处理完成后,把数据给Engine,交给Item Pipeline处理
把新的URL给Engine,重复2-6步 - Scheduler中没有任何Requests请求后,程序结束
- 创建项目流程
- scrapy startproject Lianjia
- cd LIanjia/Lianjia
- subl items.py
import scrapy
class LianjiaItem(scrapy.Item)
houseName = Scrapy.Field()
totlePrice = scrapy.Field()
- cd spiders
- scrapy genspider Lianjiaspider lianjia.com
class LianjiaspiderSpider():
name = 'lianjiaspider'
allow_domains = ['lianjia.com']
start_urls = [""]
def parse(self,response): - 项目管道:subl pipelines.py
class LianjiaPipeline(object):
def process_item(self,item,spider):
return item - 全部配置:subl settings.py
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {'Lianjia.pipelines.LianjiaPipeline':100}
DEFAULT_REQUEST_HEADERS = {'User-Agent':'Mozilla/5.0'} - cd spiders -> scrapy crawl lianjiaspider
day07
1.生成器
- yield作用:把一个函数当做一个生成器使用
- 斐波那契数
def fib(n): a,b,s = 0,1,0 while s < n: a,b = b,a+b s += 1 yield b # print(fib(5).__next__()) for i in fib(5): print(i)
- yield特点:让函数暂停,等待下次调用
2.项目:Csdn
- 知识点 yield,pipelines.py
- 目标
- https://blog.csdn.net/qq_42231391/article/details/83506181
- 标题,发表时间,阅读数
- 步骤
- 创建项目
- 定义数据结构(items.py)
- 创建爬虫程序
- 第3步抓取的数据通过项目管道去处理
- 全局配置
- 运行爬虫程序
3.项目:Daomu
- URL:http://www.daomubiji.com/dao-mu-bi-ji-1
- 爬取目标
书名,书的标题,章节名称,章节数量,章节链接 - 步骤
- 创建项目
- 改items.py(定义数据结构)
- 创建爬虫文件
- 改pipelines.py(项目管道文件)
- 配置settings.py
- 运行爬虫
4.知识点
扫描二维码关注公众号,回复:
3914796 查看本文章
- extract():获取选择器对象中的文本内容
# response.xpath('...') 得到选择器对象(节点所有内容) [<selector ...,data='<h1>...</h1>'] # response.xpath('.../text()') 得到选择器对象(节点文本) [<selector ...,data='文本内容'>] # extract() : 把选择器对象中的文本取出来 ['文本内容']
- 爬虫程序中的start_urls必须为列表
start_urls = [] - pipelines.py中必须有1个函数叫
process_item(self,item,spider),当然还可以写任何其他函数
5.存入MongoDB数据库
- 在settings.py中定义相关变量
MONGODB_HOST =
MONGODB_PORT = - 可在pipelines.py中新建一个class
from Daomu import settings class DaomumongoPipeline(object): def __init__(self): host = settings.MONGODB_HOST port = settings.MONGODB_PORT
-
在settings.py文件中设置你的项目管道
ITEM_PIPELINES = { 'Daomu.pipelines.DaomumogonPipeline': 100, }
6.存入MySQL数据库
- self.db.commit()
7.Csdn项目存到mongodb 和mysql
8.腾讯招聘网站案例
- URL:
https://hr.tencent.com/position.php?&start=0
https://hr.tencent.com/position.php?&start=10 - xpath匹配
基准xpath表达式:(每个职位节点对象)
//tr[@class="even"] | //tr[@class="odd"]
职位名称:./td[1]/a/text()
详细链接:./td[1]/a/@href
职位类别:./td[2]/text()
招聘人数:./td[3]/text()
工作地点:./td[4]/text()
发布时间:./td[5]/text()
9.设置手机抓包
- Fiddler(设置抓包)
- 在手机上安装证书
- 手机浏览器打开:http://ip地址:8888 (IP地址是你电脑的IP,8888是FIddler设置的端口)
- 在页面上下载(FiddlerRoot certificate)
下载文件名:FiddlerRoot.cer - 直接安装
- 设置代理
- 打开手机已连接的无线,代理设置 -> 改成手动
ip地址:你电脑的IP(ipconfig / ifconfig)
端口号:8888
- 打开手机已连接的无线,代理设置 -> 改成手动
今日示例
ntuk