学习爬虫第二周,爬取58同城手机号码,网址如下所示。
网页预览.png
按照学习的情况,首先需要对网页进行分析,观察页面结构。
观察页面特征:
针对大规模数据抓取,观察页面结构特征,编写的程序有没有通用性,能不能适用于所有页面。发现边界条件,找到局限性。
其次需要对程序的工作流程进行设计。
设计工作流程
搞清楚了程序根据页面如何设计之后,制定有效的工作流,保证抓取中程序的高效执行。工作输出效率更稳定。
1.大规模抓取数据,我们要知道边界在哪里,经过对网页的查询:
http://bj.58.com/shoujihao/pn{}.format(page)
我们发现当输入到pn117时,页面数据已经没有了。
同时对网页的中的titles和links进行元素位置查找,并抓取存进Mongo中,此处存储的为网页上所有手机号title的详情页的url链接。
2.经过对网页的分析,适合我们的网站是这样的:
right.png
不适合的网站是这样的:
error.png
因此在Spider2的详情页面抓取时,需要按照正确的网页结构元素进行抓取。
同时对网页中需要的元素进行抓取。
代码如下:
#!/usr/bin/env python
# coding: utf-8
from bs4 import BeautifulSoup
import requests
import time
import pymongo
#create the database
client = pymongo.MongoClient('localhost',27017)
#name:Phone
Phone = client['Phone']
#table:phone_numbers 存储手机号的表
phone_numbers = Phone['phone_numbers']
#table:phone_info 详细信息
phone_info = Phone['phone_info']
#infocont > span > b
#Spider1 提取链接
def get_links_from(page):
url = 'http://bj.58.com/shoujihao/pn{}/'.format(page)
wb_data = requests.get(url)
time.sleep(1)
Soup = BeautifulSoup(wb_data.text,'lxml')
titles = Soup.select('#infolist > div > ul > div > ul > li > a.t > strong')
links = Soup.select('#infolist > div > ul > div > ul > li > a.t')
for title,link in zip(titles,links):
data = {
'title':title.get_text(),
'link':link.get('href')
}
phone_numbers.insert_one(data)
#Spider2 详细页面
def get_item_from(url):
wb_data = requests.get(url)
time.sleep(1)
Soup = BeautifulSoup(wb_data.text,'lxml')
titles = Soup.select('#main > div.col.detailPrimary.mb15 > div.col_sub.mainTitle > h1')
prices = Soup.select('#main > div.col.detailPrimary.mb15 > div.col_sub.sumary > ul > li > div.su_con > span')
for title,price in zip(titles,prices):
title = title.get_text().replace('\n','').replace('\t','').replace(' ','')
price = price.get_text().replace('\n','').replace('\t','').replace(' ','')
data = {
'title':title,
'price':price,
'url':url
}
print(data)
phone_info.insert_one(data)
for page in range(1,117): #抓取所有页面
get_links_from(page)
for info in phone_numbers.find(): #从数据库中抓取存储的url
url = info['link']
get_item_from(url)
运行结果截图:
phone_number中的数据:
存储手机号的表.png
phone_info中的数据:
详细信息.png
总结:
进一步加深理解爬取大数据的工作流的思想和设计模式。
编程功能的模块化思想,比如对Spider1,Spider2的设计,如何保障任务工作的有效执行,尽量进行任务的解耦。
数据库使用的进一步学习。