Python爬虫 爬取数据存入MongoDB

本文介绍了一个使用Python实现的针对58同城网站的信息抓取项目。通过发送HTTP请求获取页面内容,并利用BeautifulSoup进行解析,提取商品标题、价格、发布时间和区域等信息,最终将数据存储到MongoDB数据库中。
from bs4 import BeautifulSoup
import requests
import time
import pymongo

client = pymongo.MongoClient('Localhost', 27017)
ceshi = client['ceshi']
url_list = ceshi['url_list3']
item_info = ceshi['item_info3']
def get_links_form(channel, pages, who_sells=0):
    
    list_view = '{}{}/pn{}/'.format(channel, str(who_sells), str(pages))
    wb_data = requests.get(list_view)
    time.sleep(1)
    soup = BeautifulSoup(wb_data.text, 'lxml')
    if soup.find('td' 't'):
        
        for link in soup.select('td.t a.t'):
            item_link = link.get('href').split('?')[0]
            url_list.insert_one({'url': item_link})
            print(item_link)
    else:
        pass
#get_links_form('http://bj.58.com/shuma/',2)  
def get_item_info(url):
    wb_data = requests.get(url)
    soup = BeautifulSoup(wb_data.text, 'lxml')
    no_longer_exit = '404' in soup.find('script', type = "text/javascript").get('src').split('/')
    if no_longer_exit:
        pass
    else:
        
        title = soup.title.text
        price = soup.select('span.price.c_f50')[0].text
        date = soup.select('.time')[0].text
        area = list(soup.select('.c_25d a')[0].stripped_strings) if soup.find_all('span', 'c_25d') else None
        item_info.insert_one({'title':title, 'price':price, 'date':date , 'area':area})
        print({'title':title, 'price':price, 'date':date , 'area':area})
        
get_item_info("http://bj.58.com/diannao/31994026546616x.shtml")

### 使用Scrapy抓取网页数据并存储至MongoDB #### ScrapyMongoDB集成概述 为了实现高效的数据采集和持久化操作,在爬虫开发过程中可以利用Scrapy框架内置的功能——Item Pipelines来完成这一目标。通过编写自定义Pipeline类,能够方便地对接多种类型的数据库系统,其中包括NoSQL数据MongoDB。 当使用Scrapy进行网络资源获取时,可以通过配置`settings.py`中的ITEM_PIPELINES参数指定要启用哪些pipeline组件[^1]。对于希望将收集的信息写入MongoDB的情况,则需进一步修改项目的`pipelines.py`文件,加入必要的逻辑用于建立客户端连接、选择集合以及插入文档等动作[^2]。 下面是一个完整的实例展示如何构建这样的工作流: #### 创建Scrapy项目结构 假设已经安装好了Scrapy环境,创建一个新的Spider工程命名为`example_spider`: ```bash scrapy startproject example_spider cd example_spider ``` 编辑`items.py`定义待提取字段: ```python import scrapy class ExampleItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field() ``` 接着在spiders目录下新建具体的爬虫模块,比如名为`quotes_spider.py`: ```python from ..items import ExampleItem import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" allowed_domains = ["quotes.toscrape.com"] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): quotes = response.css('div.quote') for quote in quotes: item = ExampleItem() item['title'] = quote.xpath('./span[@itemprop="text"]/text()').get().strip() item['link'] = 'http://quotes.toscrape.com' + \ quote.css('.author + a::attr(href)').extract_first('') yield item next_page_url = response.css('li.next > a::attr(href)').extract_first() if next_page_url is not None: yield scrapy.Request(response.urljoin(next_page_url)) ``` #### 配置MongoDB Pipeline 现在转向核心部分—即设置好通往MongoDB的道路。打开或创建`pipelines.py`并向其中添加如下代码片段: ```python import pymongo from .items import ExampleItem class MongoDBPipeline(object): collection_name = 'scraped_data' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): if isinstance(item, ExampleItem): # 只处理特定类型的商品条目 self.db[self.collection_name].insert_one(dict(item)) return item ``` 最后一步是在`settings.py`里激活上述编写的中间件,并提供MongoDB服务器的相关信息: ```python ITEM_PIPELINES = { 'example_spider.pipelines.MongoDBPipeline': 300, } MONGO_URI = 'mongodb://localhost:27017/' MONGO_DATABASE = 'testdb' ``` 此时运行命令启动爬虫即可自动把抓取的内容同步到本地部署好的MongoDB实例里面去了。 #### 数据分析方法 一旦完成了数据的积累过程之后,就可以借助pandas库来进行初步探索性研究。先确保已安装该依赖项(`pip install pandas`),随后按照以下方式加载之前存档下来的结果集: ```python import pandas as pd from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client.testdb data = list(db.scraped_data.find()) df = pd.DataFrame(data) print(df.head()) # 查看前几行记录概览 ``` 基于DataFrame对象,用户可以根据实际需求应用各种统计函数计算均值、频率分布直方图绘制等功能;也可以考虑调用seaborn或者matplotlib包制作更直观可视化的图表辅助理解模式特征。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值