网页手机号抓取程序(学习爬虫第二周,爬取58同城手机号码,网址如下所示。)
优采云 发布时间: 2022-01-27 23:19网页手机号抓取程序(学习爬虫第二周,爬取58同城手机号码,网址如下所示。)
学习爬虫第二周,爬取同城58的手机号。网址如下。
网页预览.png
根据学习情况,首先需要分析网页,观察页面结构。
观察页面特征:
对于*敏*感*词*的数据抓取,观察页面结构特点,编写的程序是否通用,是否可以适用于所有页面。找到边界条件,找到限制。
其次,需要设计程序的工作流程。
设计工作流程
在根据页面弄清楚程序是如何设计的之后,制定有效的工作流程,保证程序在爬取过程中的高效执行。工作输出效率更稳定。
1. 要*敏*感*词*抓取数据,我们需要知道边界在哪里。查询网页后:
http://bj.58.com/shoujihao/pn{}.format(page)
我们发现当输入到pn117时,页面数据不见了。
同时,搜索网页中标题和链接的元素位置,并将捕获存储在Mongo中,其中存储了网页上所有手机号码标题的详情页的url链接。
2.分析网页后,适合我们的网站如下:
对.png
不恰当的 网站 是这样的:
错误.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
总结: