赞
踩
在了解了静态网站爬取的思路后就可以尝试通过框架爬取:python爬虫笔记——Scrapy框架(浅学)
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()(查找文本)
结果如下,返回的是一个列表,如果通过提供的路径能找到多个值会以并返回列表,列表里的元素就不只是一个了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。