爬虫
模拟客户端发起网络请求,获取网络数据
只要客户端能够获取的数据,爬虫都能获取
获取流程:
1.确定目标网站,分析网址目标url
- 根据url发起请求,获取服务器返回的响应。
- 从响应中提取目标数据:
a.提取目标数据
b.提取新的url,执行第二步的循环 - 最终,所有的目标url访问完毕,查询结束
为什么使用python语言写我们的爬虫?
php 写多任务支持不好,多线程这块,所以不适合写爬虫,写后台不错
c/c++ 语言写爬虫,工作量比较大,需要重构,都是从底层去写,运行的效率高(仅次于汇编语言)。适用于写框架
java 可以写爬虫,python的最大竞争对手,java的生态圈比较完善,支持的库也很多,但是代码量特别大,重构的成本比较高。
python 代码简洁,语法优美,支持大量的三方模块,对多任务的支持也是友好的,并且有成熟的scrapy爬虫框架和scrapy-redis分布式爬虫框架。
七层协议
应用层:http
表示层:加密
会话层:会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话.
传输层:tcp/udp
URI(Uniform Resource Identifier):统一资源标识符
URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URN(Universal Resource Name):统一资源名称,只命名资源而不指定如何定位资源
如何处理得到的响应结果
1.本地文件存储
2.csv文件操作
3.持久化(数据库,mysql)
结构化数据 ---> 拉钩 数据以json形式,层级嵌套
非机构数据 嵌套在网页上的
urllib模块
request
1.找url
2.分析url,构建强求request对象 -> req =request.Request()
3.根据构建的request对象发起请求 -> response=request.urlopen(req
1.get请求
2.post请求
cookiejar,存服务器返回来的cookies信息
MozillaCookieJar(cookies保存在本地)
requests
get
pose(拉钩网)
cookies
sesson
xpath
xpath(xml path language):是一门在xml文档中对元素和属性进行便利语言
Beatifulsoup
xpath解析效率比beatifulsouo 高 Beatifulsoup ---> 支持css选择器
任务 进程 线程
任务 --> 进程 --> 线程
并发:同时发起多个任务,但是任务是一个个交替执行的。
并行(多核):任务数量小于等于核心数量,这时候我们的所有任务相当于同时进行。
1.多任务
2.cpu如何处理任务的
3.并发 并行
4.实现多任务方式
1.多线程
#线程锁:
# 当我们创建多个线程取修改同意变量的时候,这时候可能会造成资源混乱
json
json.loads():将json字符串转为python数据类型。
dumps:将python的数据类型转化为json字符串
dump:将python的数据类型转换为json字段串,并保存在本地文件
load:将本地json文件中的json数据,转换为python数据类型
模拟登录+PhantomJS
1.导包
2.#创建一个浏览器驱动对象
3.访问网站driver.get('http://www.baidu.com/')
实例模拟登录(比如重写start_requests获取cookies)
1.from selenium import webdriver
2.创建一个浏览器的驱动
3.根据目标网址,打开页面
4.找到输入框
5.点击登录按钮,完成登录
模拟登录+验证码识别
1.from selenium import webdriver
from PythonHTTP.YDMHTTPUSE import get_yanzhengma_result 打码平台
2.创建一个浏览器的驱动
3.根据目标网址,打开页面
4.输入账号,密码
5.根据图片识别验证码
filename = 'code_image.png'
codetype = '3006'
cid,result = get_yanzhengma_result(filename,codetype)
print(result)
6.点击登录按钮
#手动解码
图片二值化处理
scrapy爬虫项目创建
1.创建项目
scrapy startproject projectname
进入spiders文件夹下
选择是否能用通用爬虫, ----> 因为多个页,分页如果在当前页面 --> 通用爬虫 --> 否则,不能
建立普通爬虫
2.创建爬虫文件
最好域名设置对,防止以后忘记更改
聚焦爬虫创建方法
scrapy genspider qnw qunar.com
通用爬虫创建方法:
scrapy genspider -t crawl ziru ziroom.com
3.打开工程,打开创建的项目.
1.切换创建的虚拟环境 (或者每次创建一个新的虚拟环境)
2.改setting 文件
1.ROBOTSTXT_OBEY = False
2.DOWNLOAD_DELAY = 2
3.COOKIES_ENABLED = False
4.DEFAULT_REQUEST_HEADERS
添加ua'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36',
#可选方法
#一般情况下,我们将数据库的配置信息,写在settings.py文件中
注意:
#自定义settings.py中的参数设置,
#优先级比settings.py文件中设置的参数要高
3.items.py 里面根据需求定义字段
格式 : title = scrapy.Field()
4.爬虫文件
1.设置起始url
1.找前三页url分析其规律 也是为了构建下一页
2.把第一页url设为起始url
#可以设置多个url
start_urls = ['https://tuan.qunar.com/vc/index.php?category=all&limit=0%2C30',
'https://tuan.qunar.com/vc/index.php?category=all_i&limit=0%2C30',
'https://tuan.qunar.com/vc/index.php?category=all_o&limit=0%2C30',
]
#可选
##自定义起始url回调方法:
重写start_requests
#def start_requests(self):
# 使用场景:当你访问某个网站的时候,必须要登录之后,才可以获取数据
# 这时我们需要要重写start_requests,在这个方法里面模拟登录,获取
# coolies.
#1.需要模拟登录
2.打开github登录页面
3.添加账号,密码
4.点击登录按钮
5.获取cookies
cookies = driver.get_cookies()
cookies_dict = {note['name']:note['value'] for note in cookies}
print(cookies_dict)
for url in self.start_urls:
yield scrapy.Request(url=url,cookies=cookies_dict,dont_filter=True,callback=self.custome_parse)
2. def 解析 parse(self, response)
--> 提取详情链接 ---> 页面源码看是否能找到匹配的东西 --->找到或者找不到
---> 找不到 --> json js or script加载格式 ....
----> script加载格式 ---> re取匹配
附加:
执行二种方式
1.scipy carwl name
2.main
1.创建main.py
import os,sys
from scrapy.cmdline import execute
#os.path.abspath(__file__) --> 当前文件绝对路径 (找到main.py的路径)
#再传到系统文件里面
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(['scrapy','crawl','quna'])
2.右键 run main or debug main
5.管道
可以自定义数据管道(注意激活管道)
负责
#可选方法
1.close_spider 爬虫结束的时候调用
2.open_spider 爬虫开启的时候调用
数据持久化
1.在item对应类中,定义一个方法,返回sql语句和要插入的数据。
2.使用item调用这个方法,得到返回sql语句和要插入的数据。
3.执行插入操作
类方法
@classmethod
crawler ---> 包含了爬虫一些核心组件
可以获取setting 中的一些参数
图片下载
1,正常发起请求,获取图片二进制文件,保存。
2.自定义图片管道,继承ImagesPipeline
重写二方法
6.Middleware
#中间件以及反反爬:
DOWNLOAD_DELAY = 2
COOKIES_ENABLED = False
DEFAULT_REQUEST_HEADERS = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
#中间件
ip设置
设置ua,手动设置
cookies的设置:
sessinum设置
通用爬虫创建与聚焦的程序写法区别
# rules = (
# Rule(
# LinkExtractor 设置提取规则
# (allow= r'.*?p=\d+', ----> 相反的 deny
# #allowed_domains 要提取在这个域下 ------> deny_allowed_domains(优先级高)
# restrict_xpaths=('//div[@class="pages"]'), 提取这个div块下的标签, -->restrict_css
# ),
# callback='parse_data', 设置回调函数
# follow=True, 是否跟进
# process_links: 设置一个函数,根据正则提取的所有url都能在process_links回调函数中获取到--> 作用某些url进行拦截处理的时候用到
# process_request: 设置一个函数,根据正则提取的所有url都能在process_request中拦截到url构建的request对象.
# ),
# )
区别:
Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则Rule
来提供跟进链接的方便的机制,从爬取的网页结果中获取链接并继续爬取的工作.
注意:
注意:
1.当编写爬虫规则时,避免使用parse作为回调函数。
由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,
crawl spider将会运行失败。
2.要获取起始url的响应,必须重写parse_start_url
3.在设置Rule对象的时候,没有callback回调函数的时候,默认表示跟进.
使用:
当我们提取数据的目标网站的网址很有规律,并且模块很清晰,我们可以使用通用爬虫.
(不同于聚焦,引擎)
暂停与恢复
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
网友评论