自学爬虫笔记
一.基础知识学习:
1.re正则
贪婪模式:尽可能多的匹配
懒惰模式:尽可能少的匹配,精准模式
*?
+?
模式修正符:在不改变正则表达式的情况下通过模式修正符是匹配结果发生更改
修正符 含义 re.S 让. 也可以匹配多行 re.I 让匹配时忽略大小写
2.XPath表达式
表达式 含义 / 逐层提取 text() 提取标签下面的文本 //标签名[@属性='属性值'] 提取属性为XX(属性值)的标签 @属性名 代表取某个属性值
二.urllib - 爬网页
1.导包
import urllib.request import re url="想要爬取的网页地址" # 爬取到内存中去 data=urllib.request.urlopen(url).read().decode("utf-8","ignore") # 分析代码: # 首先urllib.request.urlopen(url)是通过模块打开连接网页,read()读取数据,decode("utf-8","ignore")防止内容出错进行解码,ignore参数是为避免在出现小问题的时候继续进行 len(data) # 获取数据长度,看是否有数据 pat="<title>(.*?)</title>" # 设定正则表达式 rst=re.compile(pat,re.S).findall(data) # 全局匹配 # 将网页爬取到硬盘上的文件中 urllib.request.urlretrieve(url,filename="")
2.浏览器伪装
有些时候网站会禁止你去爬取信息,但是你还可以浏览网页,那就说明并不是封了你的ip,此时你需要将自己伪装成浏览器进行爬取
3.爬取方式
目前我只知道三种,后续再加:
1.直接爬取,用urlopen
2.浏览器伪装爬取,需要用到opener
3.用户代理池浏览器伪装和2几乎一致,不同就是,将多个浏览器的user-agent放到一个列表中去
4.抓包分析
这一步是爬虫的重点也是难点,在爬虫来时的时候我们需要明确我们想要爬取什么信息
然后:
1.查看网址,查看网址的变化(简化网址,去掉无用参数仍可以定位到)
2.分析数据,查看数据中的关键字(可以查看网站源码)
5.抓包工具
fiddler----》相当于代理服务器
抓包原理:用户将信息---提交--->fiddler--->浏览器---响应--->fiddler---回馈--->用户
默认地址:127.0.0.1
默认端口:8888
如果在配置fiddler时HTTPS出现变成灰锁的情况,参考-------------
https://weibo.com/ttarticle/p/show?id=2309404103263770292716
常用命令:
命令 含义 clear 清空
三.Requests模块
1.简介与基础:
我们除了使用Urllib模块编写爬虫之外,还有很多可以选择的模块。其实,Requests模块就是另一个非常常用的模块,除此之外,后续我们还会为大家介绍Scrapy框架。这些不同的技术手段都可以实现同样的爬虫功能,具体选择那种技术手段大家可以根据爱好选择,但在此我们会分别为大家介这些常见的技术手段的使用。另外,爬虫的难点不在于技术手段本身,而在于网页分析与反爬攻克,这些我们都会逐渐介绍。
接下来我们首先为大家介绍Requests模块的基础使用。
2.requests请求方式:get,post,but...
常用的是:get
其中的参数:
参数 含义 params 一般放get请求的参数,以字典的方式存储 headers 如果要伪装浏览器,需要用到headers,主要用于添加头信息,同样以字典的方式存储 proxies 添加代理,同样以字典的方式存储,所以可以放置代理ip到里面 key值就是协议名,values 就是代理ip cookies 添加cookies到里面, data 如果使用post发数据时,可以使用data将数据发过去,data存储post需发送的数据
3.响应
在得到响应之后,也可以用一些属性来获得一些相应信息
属性 含义 text 代表对应请求响应的数据decode之后的 content 响应的数据 二进制类型的流数据 encoding 当前网页编码 cookies 当前网页的cookies url 得到当前响应的url status_code 状态码
4.参数和属性的使用
rst=requests.get("http://www.aliwx.com.cn/") # rst只是当前的一个响应 那如果相当到其中的信息则需要用到text属性,即响应数据 title=re.compile("<title>(.*?)</title>",re.S).findall(rst.text) # 如果想伪装浏览器则需要用到headers # headers可以以字典的形式写入各种头信息: # 例如: hd = {"user-agent":"对应数据"} rst=requests.get("http://www.aliwx.com.cn/",headers=hd) # 将cookies转为正常字典的形式: requests.utils.dict_from_cookiejar(rst.cookies)
爬取练习:爬取云栖社区博客
# -*- coding: utf-8 -*- """ # @Author : MHQ # @Project : Crawl _practice # @File : requests_yunxi.py # @Function : 爬取云栖博客文章 # @Time : 2020/2/10 18:32 """ import requests import re import time import urllib3 urllib3.disable_warnings() key="Python" url="https://yq.aliyun.com/search/articles/" # try: # data=requests.get(url,params={"q":key},verify=False).text data=requests.get(url,verify=False).text pat1='<div class="_search-info">找到(.*?)条关于' allline=re.compile(pat1,re.S).findall(data)[0] # print(allline) allpage=int(allline)//15+1 for i in range(0,int(allpage)): print("----正在爬第"+str(i+1)+"页----") index=str(i+1) getdata={"q":key, "p":index, } # data=requests.get(url,params=getdata,verify=False).text data = requests.get(url, verify=False).text pat_url='<div class="media-body text-overflow">.*?<a href="(.*?)">' articles=re.compile(pat_url,re.S).findall(data) for j in articles: thisurl="http://yq.aliyun.com"+j thisdata=requests.get(thisurl,verify=False).text print(len(thisdata)) pat_title='<p class="hiddenTitle">(.*?)</p>' pat_content='<div class="content-detail unsafe markdown-body">(.*?)<div class="yq-line">' title=re.compile(pat_title,re.S).findall(thisdata)[0] content=re.compile(pat_content,re.S).findall(thisdata)[0] fh=open("D:\\爬虫测试\\"+str(i)+"_"+str(time.time())+".txt","w+",encoding="utf-8") fh.write(title+"<br /><br />"+content) fh.close() # except Exception: # print("出现异常")
四.Scrapy学习
1.Scrapy模块的安装
Scrapy模块是一个非常常用的爬虫框架,使用Scrapy可以快速创建爬虫项目。要使用Scrapy,首先需要安装Scrapy,接下来为大家介绍安装方式。
建议安装顺序:
尽量在网络好的情况下安装: 1.首先,升级pip: python -m pip install --upgrade pip 2.安装wheel 3.安装lxml 4.安装Twisted 5.pip install scrapy或pip install scrapy==1.1.0rc3 6.下载安装pywin32并配置 # 注意:如果在dos环境下安装失败,可以选择下载包之后再安装,下载相应包的地址是:lfd python(https://www.lfd.uci.edu/~gohlke/pythonlibs/) # 第6步的配置需要把Python37--->Lib--->site-packages--->pywin32_system32中的两个dll文件放到C:\Windows\System32中
2.Scrapy指令学习
Scrapy 一般通过指令管理项目,常用的指令有:
指令 含义 startproject 创建爬虫项目 genspider -l 查看爬虫模板 genspider -t 模板 爬虫文件名 域名 创建爬虫 crawl 运行爬虫 list 查看有哪些爬虫 可以单独创建个文件夹进行爬虫练习
创建指令为:scrapy startproject 项目名
例:scrapy startproject ali_first
这项目下回有两个文件: 一个是ali_first文件夹 这是个核心文件夹 另一个是scrapy.cfg 这是一个配置文件 进入ali_first之后会有: __init__.py 初始化文件 items.py 用于定义目标的,你想要的爬取什么信息,统统可以在这中定义好,比如说爬标题,文章内容什么的 middlewares.py 中间件 在中间处理相应的东西 pipelines.py 爬后处理 比如写入数据库等等 settings.py 做整个项目的总体配置 设置信息 进入爬虫项目 cd ali_first 然后scrapy genspider -l
创建爬虫项目之后会有四个爬虫模板:(很多项目都是基于模板创建的)
模板名 含义 basic 基础模板 crawl 通用爬虫模板 csvfeed 爬取csv格式的数据 xmlfeed 爬取xml形式的数据 # 创建模板:(例:基于basic创建,最后哪一个是想要的模板名,然后另外的是域名) scrapy genspider -t basic fst aliwx.com.cn # 运行 scrapy crawl fst # 查看当前有哪些可用的爬虫文件: scrapy list # 查看scrapy指令可以直接输入: scrapy 编写一个Scrapy爬虫项目,一般按照如下流程进行: 1.创建爬虫项目 2.编写items 3.创建爬虫文件 4.编写爬虫文件 5.编写pipelines (可有可无吧) 6.配置settings