一、获取数据

1.requests模块

1.1 Get请求

  • 调用requests模块,模拟请求,访问数据地址requests.get(url)
  • 取到Response对象,通过对应属性,获取相应数据
    response.status_code response.content response.text response.encoding
  • 通过text属性,获取响应字符串

1.2 Post请求

在post请求里,我们使用data来传递参数,其用法和params非常相像。
解析json格式数据得到的列表或字典
response.json()

cookies

import requests
# 定义url_1,headers和data
url_1 = 'https://…'
headers = {'user-agent':''}
data = {}
login_in = requests.post(url,headers=headers,data=data)
cookies = login_in.cookies
# 完成登录,获取cookies
url_2 = 'https://…'
params = {}
# 定义url和params
response = requests.get(url,headers=headers,params=params,cookies=cookies)
# 带着cookies重新发起请求

cookies相当于存储到浏览器的账户数据,获取浏览器的小饼干,请求时带着cookies可以保证正常访问。

读取cookies

cookies_txt = open('cookies.txt', 'r')
#以reader读取模式,打开名为cookies.txt的文件。
cookies_dict = json.loads(cookies_txt.read())
#调用json模块的loads函数,把字符串转成字典。
cookies = requests.utils.cookiejar_from_dict(cookies_dict)
#把转成字典的cookies再转成cookies本来的格式。
session.cookies = cookies

获取cookies:就是调用requests对象(session)的cookies属性。

Session
session是会话过程中,服务器用来记录特定用户会话的信息。session和cookies的关系还非常密切——cookies中存储着session的编码信息,session中又存储了cookies的信息。既然cookies和session的关系如此密切,那我们可不可以通过创建一个session来处理cookies?

import requests
session = requests.session()
#用requests.session()创建session对象,相当于创建了一个特定的会话,帮我们自动保持了cookies。
url = ''
headers = {}
data = {}
session.post(url,headers=headers,data=data)
#在创建的session下用post发起登录请求,放入参数:请求登录的网址、请求头和登录参数。
print(type(session.cookies))
#打印cookies的类型,session.cookies就是登录的cookies,它的类是RequestsCookieJar
print(session.cookies)
#打印cookies
cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
#把cookies转化成字典。
print(cookies_dict)
#打印cookies_dict
cookies_str = json.dumps(cookies_dict)
#调用json模块的dumps函数,把cookies从字典再转成字符串,之后就可以把cookies字符串存储下来。

2. BeautifulSoup模块

  • 通过引入BeautifulSoup模块解析html字符串
from bs4 import BeautifulSoup
BeautifulSoup(字符串,'html.parser')
  • 通过find()和find_all()获取Tag对象或列表
    Tag.find() Tag.find_all() Tag.text Tag['属性名']
  • 由Tag组成的列表,通过遍历提取需要的数据,text属性提取除标签的文字

除了BeautifulSoup解析html,还有selenium的自带解析库,可以参考我的另一篇文章


以及re模块(通过正则表达式设定一套复杂的规则,然后把目标文本里符合条件的相关内容提取出来),感兴趣的可以去学习。
徒有海量的数据的意义非常有限。数据,要被分析过才能创造出更深远的价值。这里边的技能,叫做数据分析。将数据分析的结论,直观、有力地传递出来,是可视化。如果感兴趣的话,推荐学习这些模块与库:Pandas/Matplotlib/Numpy/Scikit-Learn/Scipy。

二、存储数据

常用的存储数据的方式有两种——存储成Excel文件、存储成csv格式文件。

1. openpyxl模块

1.1 安装模块

window电脑:在终端输入命令:
pip install openpyxl mac电脑:在终端输入命令:
pip3 install openpyxl

1.2 写入与读取Excel文件

import openpyxl 
# 写入的代码:
wb = openpyxl.Workbook() 
#1.创建工作簿
sheet = wb.active
#2.获取工作表
sheet.title = 'new sheet'
sheet['A1'] = '偶数'
#3.操作单元格
rows = [['2','4','6','8']]
for i in rows:
    sheet.append(i)
print(rows)
wb.save('偶数.xlsx')
#4.保存表格

# 读取的代码:
wb = openpyxl.load_workbook('偶数.xlsx')
#1.打开工作簿
sheet = wb['new sheet']
#2.获取工作表
sheetname = wb.sheetnames
print(sheetname)
A1_cell = sheet['A1']
#3.读取单元格
A1_value = A1_cell.value
print(A1_value)
#4.打印单元格

2. csv模块

用csv格式存储数据,读写比较方便,易于实现,文件也会比Excel文件小。但csv文件缺少Excel文件本身的很多功能,比如不能嵌入图像和图表,不能生成公式。

2.1.写入csv文件

import CSV
#调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。
csv_file = open('demo.csv','w',newline='',encoding='utf-8')
#1.创建文件
#加newline=' '参数的原因是,可以避免csv文件出现两倍的行距(就是能避免表格的行与行之间出现空白行)。加encoding='utf-8',可以避免编码问题导致的报错或乱码。
writer = csv.writer(csv_file)
#2.创建对象
writer.writerow(['11','22'])
#3.写入内容
csv_file.close()
#4.关闭文件

2.2 读取csv文件

import csv
csv_file=open('demo.csv','r',newline='',encoding='utf-8')
#1.打开文件
reader=csv.reader(csv_file)
#2.创建对象
for row in reader:
    print(row)
    #3.读取内容
csv_file.close()
#4.关闭文件

除了上面两个模块以外,如果数据量变得非常大,同时数据与数据的关系,很难以用一张简单的二维平面表格来承载。那么就需要数据库的帮助,感兴趣的可以从MySQL和MongoDB开始学起,一个是关系型数据库的典型代表,一个是非关系型数据库的典型代表。

三、反爬虫

所谓的反爬虫,是想办法将爬虫的访问量限制在一个可接纳的范围,不要让它过于肆无忌惮。原因很简单:爬虫代码写到最后,已经和真人访问网络毫无区别。服务器的那一端完全无法判断是人还是爬虫。如果想要完全禁止爬虫,正常用户也会无法访问。所以只能想办法进行限制,而非禁止。

有的网站会限制请求头,即Request Headers,那我们就去填写user-agent声明自己的身份,有时还要去填写origin和referer声明请求的来源。
有的网站会限制登录,不登录就不给你访问。那我们就用cookies和session的知识去模拟登录。

有的网站会做一些复杂的交互,比如设置“验证码”来阻拦登录,有两种办法:
1.我们用Selenium去手动输入验证码;
2.我们用一些图像处理的库自动识别验证码(tesserocr/pytesserart/pillow)。

有的网站会做IP限制,使用搜索引擎搜索“IP”,你也能看到自己的IP地址。如果这个IP地址,爬取网站频次太高,那么服务器就会暂时封掉来自这个IP地址的请求,有两种方法:
1.使用time.sleep()来对爬虫的速度进行限制;
2.建立IP代理池(你可以在网络上搜索可用的IP代理),一个IP不能用了就换一个用。
大致语法是这样:

import requests
url = 'https://…'
proxies = {'http':'http://…'}
# ip地址
response = requests.get(url,proxies=proxies)

所谓的反爬虫,从不是将爬虫完全杜绝;而是想办法将爬虫的访问量限制在一个可接纳的范围,不要让它过于肆无忌惮。