工作这么多年一直想学习一下爬虫技术,各种尝试之后发现学习的最好方式就是直接开干:那就找一个想爬的东西开始爬啊!
从模仿用正则表达式爬取,到现在通过网络课程学习使用BeatifulSoup库来爬取信息,大概花了一个月左右的零散时间,感觉还是有些进步的,得记录一下,现在就分享一下58同城二手物品信息的爬取过程。
1.分析爬取目标页面与目标
以58同城二手物品页面开始,爬取该页面中二手物品详细信息。
详细信息分布在子页面中,故,需要先从主页面获取子页面的链接,再从子页面中获取我们的目标信息。这样把爬取过程分成了两部分:
- 爬主页面获取二手物品子页面的信息;
-爬取子页面(页面示例)获取对应二手物品的标题、价格、成色、区域、发布日期、类别等信息。
对应的,我们查看对应的页面,**确定所需要爬取的元素在对应页面中所处的位置、确定获取方式。
2. 爬取主页面中的二手物品链接
通过chrome检查主页面,在对应二手物品标题位置右键、检查,查看链接对应的网页元素位置,复制对应的位置表述,如下:
复制结果即是对应的链接位置表述:
infolist > table:nth-child(7) > tbody > tr:nth-child(2) > td.t > a
由于网页构成中td标签、t样式下的a标签对应的内容都是子页面链接,故可以用‘td.t > a’作为筛选条件,通过BeautifulSoup中的select方法对其进行筛选。代码见最后部分。(注:代码中对业面中的一些特殊物品类别进行了剔除,包括转转页面、推荐信息部分等)
3. 爬取子页面中物品详细信息
将上一步获取的子页面链接传递给
过程与提取主页面中链接是一样的,不过这次需要提取的元素多了一些,我们按上述过程逐个检查,确定元素对应的筛选表述。
最后通过get_text等方式,将所需信息从爬取的元素中提取出来。
4.完整的python代码
from bs4 import BeautifulSoup
import time
import requests
url_58 = 'http://bj.58.com/pbdn/0/'
def get_url_list(url):
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text,'lxml')
url = soup.select('td.t > a[class="t"]')
url_list = ''
for link in url:
link_i = link.get('href')
if 'zhuanzhuan'in link_i:
pass
else:
if 'jump' in link_i:
pass
else:
url_list = url_list + '\n'+link_i
print('urllist',url_list)
return url_list
def get_info():
url_list = get_url_list(url_58)
for url in url_list.split():
time.sleep(1)
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text,'lxml')
type = soup.select('#header > div.breadCrumb.f12 > span:nth-of-type(3) > a')
title = soup.select('div.col_sub.mainTitle > h1')
date = soup.select('li.time')
price = soup.select('div.person_add_top.no_ident_top > div.per_ad_left > div.col_sub.sumary > ul > li:nth-of-type(1) > div.su_con > span.price.c_f50')
fineness = soup.select('div.col_sub.sumary > ul > li:nth-of-type(2) > div.su_con > span')
area = soup.select('div.col_sub.sumary > ul > li:nth-of-type(3) > div.su_con > span')
#print(type,title,date,price,fineness,area)
for typei,titlei,datei,pricei,finenessi,areai in zip(type,title,date,price,fineness,area):
data = {
'type':typei.get_text(),
'title':titlei.get_text(),
'date':datei.get_text(),
'price':pricei.get_text(),
'fineness':(finenessi.get_text()).strip(),
'area':list(areai.stripped_strings)
}
print(data)
get_info()
5.最终结果样例
{'area': ['通州', '-', '物资学院路'], 'title': 'iPad mini 2 Wi-Fi 16G 白色 港版', 'date': '2016-05-07', 'type': '北京二手平板电脑', 'fineness': '-', 'price': '1200'}
{'area': ['西城', '-', '西单'], 'title': 'iPad2 16G 国行 WiFi 平板电脑', 'date': '2016-05-07', 'type': '北京二手平板电脑', 'fineness': '-', 'price': '900'}
6.总结
其实从网页中提取对应元素并不复杂,麻烦的是反爬、对目标信息进行提取(get_text、stripped_strings等等方法还需要继续研究一下),以及对整个爬取过程的控制:通常我们要获取的信息都不止在一个页面上,这就需要一个好的过程调度,保证爬取效率。
以上仅供学习,请勿用于商业用途。