1.环境准备
由于我无法访问到Python的官网,于是在网上随便下载了一个.exe文件,安装时可以勾选配置环境路径,就不用自己配置了,版本是3.9.1。
这次我们主要使用的是Python3的requests和BeautifulSoup4两个库,可以通过pip命令进行安装,这里注意pip命令直接在用户的路径下使用即可。
pip install requests
pip install beautifulsoup4
如果是第一次使用,还需要用pip install lxml 安装 lxml库
2.准备User Agent
直接在百度中搜索,可以看到很多的在线查询工具,User Agent相当于一个身份,表明你是网站的一个访问者,我这次用的是UA查询。
3.网站分析
这次的目标网站是车主之家,我想对某地所有宝马4s店的信息进行收集,包括4s店的名称和联系方式,浏览器是Chrome。
我们按下F12可以看到网页的代码,选择代码块浏览器会把对应页面结构标注出来,如图
查看要爬取的信息对应的代码,在这里是4s店列表,可以看到每个4s店的模块对应着一个dl标签
可以看到公司的名字存储在class=title的div下的a标签中
电话号码存储在class="camp clearfix"的div下的em标签中。
对URL进行分析发现这里面的page的值代表了列表的页码,这个网站每页会显示20个公司。
4.代码编写
这里会对代码逐段分析,最后我会附上完整的代码
(1)引入requests库
#导入http请求库requests
import requests
(2)定义两个变量来指定UA信息,上面是分析到的,下面headers不用修改。
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
headers = {'User-Agent':user_agent}
(3)通过for循环对每一页进行爬取,该地区有4页则循环由1到5,定义一个rows列表来保存结果。
rows=[]
for i in range(1,5):
(4)requests.get()方法读取网页,这里是将索引i对应到URL的{}之中,可以在每一次循环中访问不同的页码。
r = requests.get('http://dealer.16888.com/?tag=search&pid=31&brandId=57248&page={}'.format(i),headers = headers)
(5)创建一个名为soup的BeautifulSoup实例
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'lxml', from_encoding='utf8')
(6)通过soup实例对需要爬取的标签进行筛选,find_all方法的两个参数是标签名和标签类。返回值是一个标签的列表。
companys = soup.find_all('div',class_='title')
phones = soup.find_all('div',class_='camp clearfix')
(7)对companys列表进行循环。将company中对应的a标签的字符串和对应的phone中的em标签的值作为一个字符数组列表存入rows中,
j = 0
for company in companys:
a=company.find('a')
first = phones[j].select('em:nth-of-type(1)')
row=[a.string,first]
j=j+2
#调用append方法存入
rows.append(row)
(8)引入csv库,csv是一种表格文件,将数据写入csv。writerow插入一条数据,writerows插入一组数据。
import csv as csv
place='浙江'
header=['公司-'+place,'电话号']
with open ('D:\\paqushuju\\数据.csv','a+',encoding = 'gb18030') as f:
f_csv=csv.writer(f)
f_csv.writerow(header)
f_csv.writerows(rows)
结果如下:
5.完整代码
一定要注意Python语言的缩进,因为Python是通过缩进标识代码结构的,缩进不要用空格,用TAB。
#导入http请求库requests
import requests
import re
#指定我们的user agent
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
headers = {'User-Agent':user_agent}
# requests.get()方法读取网页
rows=[]
for i in range(1,5):
r = requests.get('http://dealer.16888.com/?tag=search&pid=31&brandId=57248&page={}'.format(i),headers = headers)
from bs4 import BeautifulSoup
#创建一个名为soup的实例
soup = BeautifulSoup(r.text, 'lxml', from_encoding='utf8')
companys = soup.find_all('div',class_='title')
phones = soup.find_all('div',class_='camp clearfix')
j = 0
for company in companys:
a=company.find('a')
first = phones[j].select('em:nth-of-type(1)')
row=[a.string,first]
print(row)
print(j)
j=j+2
rows.append(row)
import csv as csv
place='浙江'
header=['公司-'+place,'电话号']
with open ('D:\\paqushuju\\数据.csv','a+',encoding = 'gb18030') as f:
f_csv=csv.writer(f)
f_csv.writerow(header)
f_csv.writerows(rows)
6.参考文章
https://blog.csdn.net/weixin_42156897/article/details/94581362
https://blog.csdn.net/weixin_42156897/article/details/94594753