之前用python做了一个爬取58同城的例子,学自python零基础爬虫视频,然后经自己更改,就可以很容易的爬取到数据,在这里记录一下学习中的知识要点。
1. 用requests库获取网页信息
原理
模拟人类访问网页,从而获取远端服务器发送的网页全部内容,也叫发送请求(requests)
。
编程
引用库:import requests
一般只用需要用到requests库的get
方法 ,最简单的使用方法如下,url填需要访问的网页的网址字符串,返回请求到的内容到web_data
import requests
...
web_data = requests.get(url)
但是许多网站有反爬虫机制,直接请求可能会被识别出来我们是用机器在获取信息,我们可以使用添加请求头的方式
进一步模拟人类来向远端服务器请求
import requests
...
headers = {
"User - Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}
web_data = requests.get(url, headers=headers)
除了添加请求头外,我们还要控制访问频率,一般使用Sleep
函数就可以其参数是以秒为单位。因为人类的访问间隔在1s以上,而计算机的访问速度非常快,1s可能能达到千万次(只是很多,没有具体试过),所以一般为了保险,都会sleep(2),甚至更多。
import requests
import time
n = 10000
for i in range(n)
web_data = requests.get(url)
time.sleep(2)
...
好了,到现在为止,我们应该可以应付所有的情况,把网页的内容给爬取下来了,如果想看具体内容,可以用print
函数直接打印出来,但这只是万里长征的第一步,最重要的是从网页内容中快速解析出我们需要的内容信息
2.用BeautifSoup库解析网页信息
先对爬取到的整个网页内容按照相应格式进行解析,此时我用lxml
格式进行初步解析
from bs4 import BeautifulSoup
import requests
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text, 'lxml')
我们只需要使用两个方法:find,find_all来搜索,find只搜索一条(如果有多个,只搜索第一个)信息,但是find_all搜索全部的信息,但不管哪个都需要浏览器中的开发者工具
进行辅助,我们这里以58同城二手车交易首页、Chrome浏览器为例。右击网页空白处,选择检查
,就可以看到开发者工具,点击下图箭头所指的图标,然后点击网页中的哪一部分,就可以在右边看到相应的代码。
![这里写图片描述](https://img-blog.csdn.net/20180208191421495?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ19TRVNFUg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
选择到每个商品的标题上,如下图
![这里写图片描述](https://img-blog.csdn.net/20180208191727778?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ19TRVNFUg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到商品的标题信息被存储在一个class=info_tit
的h1标签中,然后看看其他的信息,都存储在不一样的class中,那么可以基本判定,此页的所有商品的标题信息都在class=info_tit的h1标签中,那么我们就可以筛选出所有的h1标签,然后再从中筛选出class=info_tit的那些内容
from bs4 import BeautifulSoup
import requests
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text, 'lxml')
titles = soup.find_all('h1', {"class": "info_tit"})
看到代码,就很容易理解find_all方法的用法了,第一个参数是第一个需要筛选的条件,是一个字符串,第二个参数是一个字典,可以有多对键值,这里我们只有一对,class=info_tit
其他信息都是这样照猫画虎,非常简单明了,但是获取到的信息要再想办法将信息整理起来,以更人性化的方式呈现出来,那些方法在此处不多说。本人写好的整个代码可以自行从本人github获取。