爬虫入门
一、什么是爬虫
爬虫spider就是向网站/网络发出请求,获取资源后分析并提取有效数据。
其实就是通过程序模拟浏览器请求站点的行为,将站点的HTML代码和JSON数据等爬到本地,进而提取自己所需要的数据。
总结:网页——请求——数据——提取
二、具体原理
2.1发起请求
使用http库函数向目标网页发起请求,也就是发一个Request
import requests
from bs4 import BeautifulSoup
# 发起请求并获取响应
url = 'https://example.com' # 你要爬取的网页地址
Request包含请求头、请求体等,但是不能执行JS和CSS代码(当然提取数据大部分也不需要JS和CSS代码)
2.2获取响应
如果请求正确,会得到一个想要的Response,可能是Html、JSON、图片、视频等。
#获取响应
response = requests.get(url)
2.3对响应进行解析
解析html数据:正则表达式(RE模块)、xpath(路径)、beautiful soup、css
解析json数据:JSON模块
解析二进制数据:以wb的方式写入文件("w"表示以文本模式写入文件,而"b"表示以二进制模式写入文件)
# 解析响应
soup = BeautifulSoup(response.text, 'html.parser') # 假设响应内容是HTML,使用'html.parser'解析器
# 提取数据
# 根据网页结构和所需数据的位置,使用BeautifulSoup提供的相关方法来提取数据
# 以下只是一个示例,具体的数据提取方法需要根据网页结构进行调整
data = soup.find('div', class_='example-class').text
2.4得到解析后的数据并存储
数据库或者csv文件
import csv
data = [['Name', 'Age', 'City'],
['John', '25', 'New York'],
['Alice', '30', 'Chicago'],
['Bob', '35', 'San Francisco']]
filename = 'data.csv' # CSV文件名
# 写入CSV文件
with open(filename, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)
三、相关知识
3.1request
-
请求方式
常见的请求方式:GET(获取) POST(传递)
-
请求的url
url是全球统一资源定位符,用来定义互联网上一个唯一的资源 例如:一张图片、一个文件、一段视频都可以用url唯一确定
-
请求头
User-agent:请求头在需要有一个用户代码的客户端配置,否则服务器可能会把请求当作一个非法用户
cookie:cookie用来保存登录信息
-
请求头需要的参数
Referrer:访问源从哪里来(一些大型网站,会用Referer做防盗链,所以要注意模拟)
user-agent:
cookie:
-
请求体
如果是get方式,请求体没有内容 (get请求的请求体放在 url后面参数中,直接能看到)
如果是post方式,请求体是格式化数据
3.2response
-
响应状态码
200 响应成功
301 跳转
404 网页不存在
403 无权限访问
502 服务器错误
-
response header——响应头
响应头需要注意的参数:Set-Cookie:BDSVRTM=0; path=/:可能有多个,是来告诉浏览器,把cookie保存下来
-
perview——网页源代码
json数据
如网页html,图片
3.3 request模块
request模块是Python中用于发送HTTP请求的一个第三方库,通过它可以方便地实现网络请求和获取响应。它提供了简洁易用的API,包括GET、POST、PUT等请求方法,可以设置请求头、请求体、查询参数等,同时还支持文件上传、Cookie管理等功能。
使用request模块,你可以通过发起HTTP请求获取网络资源,例如网页内容、API数据等。通过获取的响应,你可以进一步处理和解析数据,以及执行其他业务逻辑。
发送GET请求:
import requests
url = 'https://example.com'
response = requests.get(url)
print(response.text) # 获取响应的文本内容
发送POST请求:
import requests
url = 'https://example.com'
data = {'username': 'admin', 'password': '123456'}
response = requests.post(url, data=data)
print(response.status_code) # 获取响应的状态码
3.4re 正则表达式
re是Python内置的正则表达式模块,它提供了一组函数用于处理字符串匹配和查找。正则表达式是一种用来描述和匹配特定模式的字符串,可以用于搜索、匹配、替换等操作。
使用re模块,你可以通过定义正则表达式来检查字符串是否满足指定的模式,或者从字符串中提取符合条件的部分。
以下是re模块的一些常见用法示例:
使用match方法匹配字符串起始部分:
import re
pattern = r'^Hello'
string = 'Hello, World!'
match = re.match(pattern, string)
if match:
print('Match found')
else:
print('Match not found')
使用search方法在字符串中查找匹配项:
import re
pattern = r'World'
string = 'Hello, World!'
match = re.search(pattern, string)
if match:
print('Match found')
else:
print('Match not found')
3.5Xpath
XPath是一种基于路径表达式的查询语言,常用于在XML和HTML文档中定位和提取数据。在Python中,我们可以使用lxml库来解析和处理XML和HTML文档,并使用XPath来定位和提取其中的数据。
使用XPath,你可以通过元素的路径、属性、文本内容等特征来定位和提取数据。
以下是XPath的一些常见用法示例:
from lxml import etree
xml_string = '''
<root>
<book category="fiction">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
</book>
<book category="fiction">
<title lang="en">The Hobbit</title>
<author>J.R.R. Tolkien</author>
</book>
</root>
'''
# 解析XML
root = etree.fromstring(xml_string)
# 使用XPath提取数据
titles = root.xpath('//book/title/text()')
for title in titles:
print(title)
3.6BeautifulSoup
BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了简化的API来遍历和搜索文档树,以及提取其中的数据。BeautifulSoup会自动将输入文档转换为Unicode,并使用特定的解析器进行解析。
使用BeautifulSoup,你可以根据标签、属性、文本内容等特征来进行文档的解析和数据提取。
以下是BeautifulSoup的一些常见用法示例:
from bs4 import BeautifulSoup
html = '''
<html>
<body>
<h1>Hello, World!</h1>
<p>This is a paragraph.</p>
<a href="https://example.com">Visit Example</a>
</body>
</html>
'''
# 解析HTML
soup = BeautifulSoup(html, 'html.parser')
# 提取数据
title = soup.h1.text
paragraph = soup.p.text
link = soup.a['href']
print(title)
print(paragraph
3.7JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
在python中主要使用 json 模块来处理 json数据。
3.8threading线程
使用threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法
四、爬虫框架
4.1Scrapy主要组件
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
4.2Scrapy的运作流程
引擎:Hi!Spider, 你要处理哪一个网站?
Spider:老大要我处理xxxx.com。
引擎:你把第一个需要处理的URL给我吧。
Spider:给你,第一个URL是xxxxxxx.com。
引擎:Hi!调度器,我这有request请求你帮我排序入队一下。
调度器:好的,正在处理你等一下。
引擎:Hi!调度器,把你处理好的request请求给我。
调度器:给你,这是我处理好的request
引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求
下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)
Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
管道``调度器:好的,现在就做!