废话不多说,直接上步骤,还不知道什么是爬虫的小伙伴请观看别的博主的文章,我只是需要用才学一点,做个笔记,我了解的也不够清楚,就不解释了。
在了解了静态网站爬取的思路后就可以尝试通过框架爬取:python爬虫笔记——Scrapy框架(浅学)
步骤
注意:不要频繁请求某个网站或者说是服务器,这样会导致别人的服务器会崩或者别的问题,还有可见即可得,不可见即不可得,就是VIP、付费、或者涉及隐私等等的东西别爬。
1. 我们就用最基础的request库来进行演示,首先导入request库,给一个正确的网页给url,然后通过request进行请求(爬取)。我们以有道在线翻译为例。
import requests
url = 'https://fanyi.youdao.com/' #网页
result = requests.get(url) #爬取
print(result.text) #打印爬取结果的文本
如果看到这样的结果就说明请求成功,也就是爬取成功。
2. 因为有些网站有反爬机制,假设我们的爬取不成功,那如果不成功怎么办呢,那么我们就需要让爬虫模拟成浏览器,不然别人知道你是爬虫。所以我们要加个user-agent,怎么找到user-agent和cookie等会再说。
import requests
headers = {
'user-agent' : '这里是自己浏览器的user-agent',
}
url = "https://fanyi.youdao.com/"
result = requests.get(url,headers=headers)
print(result.text)
那如果还不成功怎么办呢,那就再加一个cookie
import requests
headers = {
'user-agent' : '这里是自己浏览器的user-agent',
'cookie' : '自己的cookie'
}
url = "https://fanyi.youdao.com/"
result = requests.get(url,headers=headers)
print(result.text)
那要是还不成功怎么办呢,如果还不成功找别人吧,我也不知道该怎么办了。总的来说就是一个不断试探它底线的过程。
接下来讲怎么拿到user-agent和cookie,1. 在要爬取的网页按F12或Fn+F12(一般是笔记本电脑)看到右侧的开发者工具——>2. 找到网络(Network)这一块,随便选择可以文件左键点击——>3.再点击标头,看看有没有我们要找的东西,没有就换一个文件继续找。
3. 这里我建议将爬下来的数据写入文件,通过读取文件查找效果一样的,减少练习时给服务器添加的负担
这是其实是文件练习的全部代码了,有些不理解的地方往后看
import requests
#写入HTML文件
url = "https://fanyi.youdao.com/"
result = requests.get(url)
content = str(result.content,'utf-8')
with open('youdao.html','w',encoding='utf-8') as file:
file.write(content)
from lxml import etree
读取文件练习
with open('youdao.html','r',encoding='utf-8') as file:
html = file.read()
dom = etree.HTML(html)
txt = dom.xpath('//a[@id="transMan"]/text()')
print(txt)
4. 那我请求成功后接下来就要定位我们需要爬取的东西的位置,例如我们就爬人工翻译四个字
1.首先需要在网页的开发者工具部分从刚刚的网络转到元素——>2.点击左边的那个锁定图标——>3.点击我们要爬取的人工翻译四个字——>4. 找到需要爬取的东西,鼠标右键选择复制,再选择复制xpath——>5.回到代码中写下函数并粘贴路径在xpath里。
这是不写入HTML的情况,同样需要借助etree函数
import requests
import lxml.etree as etree
url = "https://fanyi.youdao.com/"
result = requests.get(url)
result = etree.HTML(result.text)
text = result.xpath('//*[@id="transMan"]/text()')
print(text)
这里需要导入新的函数库etree,目的是为了将爬下来的数据整理成格式化的HTML形式,方便用xpath进行查找,xpath里的路径建议自己写。
//a[@id="transMan"]/text() 还是刚才的四个字
格式大概是://(当前位置下全查找)a(所在位置的标签或上级标签)[@id="transMan"](标签的属性)/(标签下按格式查找)text()(查找文本)
结果如下,返回的是一个列表,如果通过提供的路径能找到多个值会以并返回列表,列表里的元素就不只是一个了。