整理一下自己的笔记
是根据b站up主 大大的小番茄 的教程来看的,非常适合很新很新的新手。
首先要明白爬虫的思路:请求获取网页IP,根据已知的IP获取服务器返回的HTML,找到HTML里面自己需要的信息。
第一部分:HTML
大部分网页的构成分为三个部分:HTML(相当于骨架)、CSS(定义了外观)、JScript(表示功能)。爬虫主要针对的是HTML。
看到的HTML内容的<>称为标签。
常见的标签如下:
标签 | 用法或意义 |
---|---|
| 中间的元素是网页 |
| 用户可见内容 |
| 框架 |
| 段落 |
| 列表 |
| 图片 |
| 超链接 |
- 其中一些成对出现的标签称为闭合标签,比如
- 另外一些称为自闭和标签,比如
,只有一个尖括号,没有与之对应的。
标签里都有一些标签的属性,比如id、style、class等等,标签拥有层级关系。
一个例子:
PS.关于URL
简而言之,就是网址。
http协议——端口80
https协议——端口443
这部分视频非常详细地简单阐述了一下,感兴趣或者有需要的可以看看。
第二部分:python中模拟请求的库
要注意的是:python访问HTML的时候会被拒绝,因此需要“伪装”成一个用户在浏览,因此需要修改头参数(user-agent),还要注意refer、cookie,这部分直接复制粘贴相应的代码即可。
requests库
import requests
url = "https://www.baidu.com/" # 想要访问的网址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.101 Safari/537.36',
'cookie': '....'}
# 伪装成浏览器
response = requests.get(url, headers=headers) # 响应一个HTML文件
# print(type(response))
# 如果查看response的类型会发现得到的是
# 如果想查看到具体的HTML内容可以 print(response.text) 得到的东西看起来像乱码,是因为解析网站内容的编码问题(utf8),那么只要指定编码方式来解析就可以看到了
content = response.content.decode('utf-8')
如何查看一个网页的编码格式?
查看网页HTML的里面的
或者在控制台(console)输入 document.charset
或者直接在python中查询response.encoding
第三部分:数据提取Xpath
数据提取方式:Xpath、beautifulsoup4、正则匹配
(这里有一个正则匹配的网站我个人觉得很好用:正则)
使用Xpath的目的是找到数据的路径,这里分两部分记录,
第一钟方法,或者说最简单的方法:直接复制Xpath路径。
第二种方法,需要理解一下Xpath的语法:
Xpath语法:
用法 | 说明 |
---|---|
表达式 选取细节点的所有子节点 如div | 选取div下的所有标签 |
//,如//div | 选取整个HTML页面的所有div标签 |
/,如//head/title | 选取head标签下的title标签 |
@,如//div[@id] | 选取带有id属性的div标签 |
. ,如./span | 选取当前节点下的span标签 |
另外Xpath的语法很丰富,还有一些别的语法,比如通配符、提取属性内容等等,此处略。
(找路径:浏览器 shift+CTRL+C)
(这个地方也可以用一些插件辅助自己找路径)
第四部分:lxml
由于Xpath只能作用于HTML文件而无法作用于content(前文python代码中将HTML转存为content,但其本质上是字符串而不是真正的HTML),所以需要lxml库将其还原为真正的HTML文件供Xpath使用。
使用lxml中的etree对html进行处理:
将字符串转为HTML:
from lxml import etree
html = etree.HTML(string) # 将字符串转为HTML
找到想要的东西:
divs = html.xpath('//div') # 找到HTML中的所有div元素
for div in divs:
d = etree.tostring(div,encoding='utf8').decode('utf8')
# HTML是无法直接print的,所以要用 utf8 解析并且转化为字符串
print(d) # 把找到的元素展示出来
# 或者
divs = html.xpath('//div//text()') # divs是list类型
print(divs)
# 实际 *** 作的时候发现上面的运行不了总是有TypeError: Type 'list' cannot be serialized.报错
# 后来使用了下面的代码可以运行成功
# 要注意的是//text(),我看其他人的教程都是/text(),后者我没有运行成功
我的代码:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.101 Safari/537.36',
'Cookie': "xhsTrackerId=db9b893f-c57e-4b75-cb2d-8a01dc3e2ef9; customerClientId=718184282725177; "
"timestamp2=20220416ac00c9ab7cf224aab55b56f7; "
"timestamp2.sig=Uis941-HUqopB8oy944WYrzE1Ffv09eCLwRzd5GD080; "
"xhsTracker=url=noteDetail&searchengine=baidu; extra_exp_ids=recommend_comment_hide_clt1,"
"supervision_exp,supervision_v2_exp,commentshow_exp1,gif_clt1,ques_clt2"}
url = 'https://www.xiaohongshu.com/discovery/item/625d43e900000000010256e0'
response = requests.get(url, headers=headers)
# print(type(response))
# print(response.encoding) # 查看编码方式
# print(response.status_code) # 响应码为200,说明正常相应
content = response.content.decode('utf-8')
print(type(content))
# print(content)
# with open("text.html", "w", encoding='utf-8') as f:
# f.write(content)
html = etree.HTML(content)
# print(type(html))
wenan = html.xpath('//*[@id="app"]/div/div[2]/div[1]/main/div//text()') # 类型为list
print(wenan)
到这里就可以得到内容了
PS.要注意一些反爬虫会封IP:可以多用几个user-agent,具体方法可查看其他人的文章
第五部分:导出数据
读取excel文件:xlrd库
写出excel文件:xlwt库
workbook = xlwt.Workbook(encoding='utf8') # 新建一个excel,编码方式为utf8
sheet = workbook.add_sheet('text') # 在excel里面新建sheet,sheet名称为text
text.write(0,0,'name') # 在“text”的sheet下的(0,0)位置(也就是A1)处写入“name”
# 如果要批量写入那就加循环就好了
workbook.save("C:\Users\zhang\Desktop\新建 XLSX 工作表.xlsx")
# 保存在你想保存的对应路径下的文件中
# 一个找路径的小tip:shift+鼠标右键
很惭愧我是结果导向才学的爬虫,希望以后有机会把后面的教程看完,继续这个笔记。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)