Python实战计划学习笔记:week2_2 爬取手机号

学习爬虫第二周,爬取58同城手机号码,网址如下所示。

Python实战计划学习笔记:week2_2 爬取手机号_第1张图片
网页预览.png

按照学习的情况,首先需要对网页进行分析,观察页面结构。

观察页面特征:
针对大规模数据抓取,观察页面结构特征,编写的程序有没有通用性,能不能适用于所有页面。发现边界条件,找到局限性。

其次需要对程序的工作流程进行设计。

设计工作流程
搞清楚了程序根据页面如何设计之后,制定有效的工作流,保证抓取中程序的高效执行。工作输出效率更稳定。

1.大规模抓取数据,我们要知道边界在哪里,经过对网页的查询:

http://bj.58.com/shoujihao/pn{}.format(page)

我们发现当输入到pn117时,页面数据已经没有了。

同时对网页的中的titles和links进行元素位置查找,并抓取存进Mongo中,此处存储的为网页上所有手机号title的详情页的url链接。


2.经过对网页的分析,适合我们的网站是这样的:

Python实战计划学习笔记:week2_2 爬取手机号_第2张图片
right.png

不适合的网站是这样的:

Python实战计划学习笔记:week2_2 爬取手机号_第3张图片
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中的数据:

Python实战计划学习笔记:week2_2 爬取手机号_第4张图片
存储手机号的表.png

phone_info中的数据:

Python实战计划学习笔记:week2_2 爬取手机号_第5张图片
详细信息.png

总结:

  • 进一步加深理解爬取大数据的工作流的思想和设计模式。

  • 编程功能的模块化思想,比如对Spider1,Spider2的设计,如何保障任务工作的有效执行,尽量进行任务的解耦。

  • 数据库使用的进一步学习。

你可能感兴趣的:(Python实战计划学习笔记:week2_2 爬取手机号)