爬取网页的过程
1.发送请求和获取相应
2.对获取的response进行想要的信息的提取
3.对信息进行存储
(1)发送请求和相应
基本的是requests库的使用
共有参数:
headers
headers以字典形式添加,有的网页需要多一点的头部信息才可以获得响应。可以人为的删除一些没必要的头部信息。
nb一点的用法,生成随机的头部信息用fake_useragent这个库,要pip install 一下。
from fake_useragent import UserAgent
UA = UserAgent().random
params
这个参数是以字典的添加是要以字典的形式,添加了params就是在url后面多了一些参数以?&xxxxx&xxxxx加在后面表示,一般很少用这个参数,因为这部分一般是直接对应输入的变量代替。
verify
有的网站爬取时会产生SSL错误,可以再请求的时候加上verify = False 就可以避免这种情况发生。
import requests
response = requests.get(url,headers=headers,verify=False).content.decode()
proxies
用来进行IP代理,防止同一个IP使用此处太多和访问太频繁而被网站发现和封掉,也是字典用法。
import requests
proxies = {
'http': '1.197.204.204',
}
response = requests.get(url,headers=headers,proxies=proxies)
然后最常用的就是get()方法了,其次是post()方法,模拟登录的时候最好用post,具体得看一下,network部分的信息,看Request Method它用啥方法提交的申请,程序就用对应的方法去提交申请。如果是get方法就注意一下最下面的Query String部分,如果是post就注意下一最下面的From data部分,这个具体就是动态网页的分析了。
维持会话有两个方法,一个是加上Cookies信息,另一个是用session()
import requests
#1.创建一个session对象
#2.用session发送一个get或者post请求
session = requests.session()
response = session.get(url,headers)
(2)对获取的response进行想要信息的提取
基本的是BeautifulSoup,Xpath,re对xml格式进行信息提取,和jsonpath对json格式进行信息提取
BS,主要是select,get方法。我用得少。
Xpath逻辑很清晰,思路是“找到循环节点,然后找大循环,拼接循环内部的Xpath路径”,返回的是一个列表。感觉很好用,但有时挺麻烦。注意数数是从1开始数,区别与其他东西
re的进行信息的提取,有的信息用re提取很简单,最主要用的是re.findall(),返回一个列表。还有使用re.sub()对信息进行过滤。
如果一段文字里面有一些标签要阻碍你提取,比如一篇文章里面他想让你爬取难一丢丢,在里面多加了一些<>标签,并且这些标签是一样的,这个时候有两种方法解决1.提取所有这个标签里面的信息返回一个列表,对列表使用 ‘’.join(list)这个方法
返回一个完整的字符串。2.用re.sub()方法直接把里面的<>标签匹配并替换掉。
jsonpath,只要会Xpath,jsonpath就不是问题了,用来对json格式的数据进行提取。首先要loads一下,把json对象转换为python对象。然后用字典的方式或者jsonpath进行提取。要去补一下字典的知识了。。。
(3)对信息进行存储
txt格式
def write_file(html):
soup = BeautifulSoup(html,'lxml')
texts = soup.select('div.articlecon > p')
for text in texts:
real_text = text.get_text()
file.write(real_text+'\n')
csv格式
方法1,用csv模块
import csv
fp = open('D:/网易云音乐Top200.csv','wt',newline='',encoding='utf8')
writer = csv.writer(fp)
writer.writerow(('a','b','c','d'))
....
....
....
for ....
writer.writerow((a,b,c,d))
方法2,用xlwt模块
import xlwt
def getExel(mylist):
#表头的标题
header = ['','','']
book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('Sheet1')
for k in range(len(header)):
sheet.write(0,k,header[k])
i = 1#注意要从1开始,上面那一行标题已经占了一行
for list in mylist:#一个二重循环
j = 0
for data in list:
sheet.write(i,j,data)
j += 1
i += 1
book.save('D:/test.xls')
方法三,pandas库,还不会。。
json格式:无
数据库MongoDB
import pymongo
#连接数据库
client = pymongo.MongoClient('localhost',27017)
mydb = client['xxxx']
yyyy = xxxx['yyyy']
....
....
....
for .....
data = {
....
....
....
}
yyyy.insert_one(data)
图片存储
方法1,requests库
path = 'D:/whatphoto'
url = 'xxxxxxxxxxx.jpg'
data = requests.get(url,headers = headers)
fp = open(path+ url[-10:],'wb')#注意写进文件时,切片的字符串名字不可有/出现
fp.write(data.content)
fp.close()
方法2,用urllib库
用urlretricev(url,path)
from urllib.requests import urlretrieve
url = '......'
path = '........'
urlretrieve(url,path)
对静态网页和动态网页的理解:
静态网页
静态网页,及东西是不变的,翻页是跟表面的url变化而变化,一次性就加载完源代码里面的html的信息。一般用解析xml 的方法进行解析就可以了
动态网页
翻页的时候表面的url没有变化,用开发者工具进行观察时,可能是Ajax接口,用隐藏的url加载xml数据或json数据。这种就要用抓包找到url的变化规律对url进行遍历,后面就变成解析静态网页一样的了。另一种比较特别的是,其抓包抓到的url是没有变化的,是通过post方法,提交表单的时候表单里面的字段在变化,然后服务器根据你表单里面的字段给你相应不同的json文件。栗子:拉勾网
面向对象的理解:
尝试了用面向对象编写爬虫程序,对面向对象的理解:什么是对象?对象就是客观存在的一个东西,比如一只木椅子,而如果我要表示一类椅子,用程序表示,那么我们就要把椅子进行抽象化,这就要定义一个class来封装这个抽象化以后的东西,这就是类。而我要根据这个类产生一个东西,就是实例化。
会什么和不会什么
我学会了什么:请求方式,Xpath,re,用面向对象编写爬虫,mongodb数据库的存储,txt、csv、xlwt的存储方式,BS的select。Ajax的分析和动态json的分析。基本的多进程爬虫,词云的生成。
不熟悉:BS没有系统的学习,只会select,jsonpath为完全熟练。深入的多线程爬虫
待学习:Scrapy框架,模拟登陆,os模块,MySQL数据库,selenium的使用,验证码处理,反爬虫处理,分布式。