Pyhton 爬虫案例(五)--adbapi模块

上一篇爬虫案例讲了数据库的连接,本片来讲利用异步网络框架来连接数据库:Twisted.enterprise中adbapi模块,adbapi中的connectionPool方法是用来创建数据库连接池对象的,每个连接对象在独立的线程当中工作,内部依然是用pymysql等库去访问数据库的;adbapi中的runInteraction方法以异步方式去调用insert_db函数,连接对象中的参数item就会被传给insert_db的第二个参数,等insert_db执行完之后,连接对象会自动调用commit方法。
本片爬取的网站是:http://www.ci.commerce.ca.us/bids.aspx ,我们先建立新的爬虫项目,取名随意,先看items.py:

from scrapy import Item,Field

class Csdn2Item(Item):
    title = Field()
    dueDate = Field()
    web_url = Field()
    bid_url = Field()    #标书链接
    issuedate = Field()
    category = Field()   #标书分类

在spiders文件夹下创建Commerce.py爬虫文件:

import scrapy
import datetime
from scrapy.http import Request
from CSDN2.items import Csdn2Item

class CommerceSpider(scrapy.Spider):
    name = 'commerce'
    start_urls = ['http://www.ci.commerce.ca.us/bids.aspx']
    domain = 'http://www.ci.commerce.ca.us/'

    def parse(self, response):
        # xpath定位
        result_list = response.xpath("//*[@id='BidsLeftMargin']/..//div[5]//tr")
        for result in result_list:
            item = Csdn2Item()
            title1 = result.xpath("./td[2]/span[1]/a/text()").extract_first()
            if title1:
                item["title"] = title1
                item["web_url"] = self.start_urls[0]
                urls = self.domain + result.xpath("./td[2]/span[1]/a/@href").extract_first()
                item['bid_url'] = urls
                yield Request(urls, callback=self.parse_content, meta={'item': item})

    def parse_content(self, response):
        item = response.meta['item']
        category = response.xpath("//span[@class='BidDetailSpec']//text()").extract_first()
        item['category'] = category
        issuedate = response.xpath("//span[(text()='Publication Date/Time:')]/following::span[1]/text()").extract_first()
        item['issuedate'] = issuedate
        expireDate = response.xpath("//span[(text()='Closing Date/Time:')]/following::span[1]/text()").extract_first()
        # 如果截止日期是open until contracted的话,就默认截止日期是明天
        if 'Open Until Contracted'in expireDate:
            expiredate1 = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime('%m/%d/%Y')
        else:
            expiredate1=expireDate
        item['dueDate'] = expiredate1
        yield  item

接下来是pipelines.py文件的编写:

# -*- coding: utf-8 -*-
from scrapy.conf import settings
from twisted.enterprise import adbapi  #记得安装twisted包

class Csdn2Pipeline(object):
    def open_spider(self,spider):
        db = settings['MYSQL_DB_NAME']
        host = settings['MYSQL_HOST']
        port = settings['MYSQL_PORT']
        user = settings['MYSQL_USER']
        passwd = settings['MYSQL_PASSWORD']
        #创建连接池对象,用pymysql访问数据库
        self.dbpool = adbapi.ConnectionPool('pymysql',host = host,port = port, db= db,user=user,passwd=passwd,charset ='utf8')

    def process_item(self, item, spider):
        #去调用insert_db函数
        self.dbpool.runInteraction(self.insert_db,item)
        return item

    def insert_db(self, tx, item):
        values = (
            item['title'],
            item['dueDate'],
            item['web_url'],
            item['bid_url'],
            item['issuedate'],
            item['category'],
        )
        try:
            sql = 'INSERT INTO bids(title,dueDate,web_url,bid_url,issuedate,category) VALUES (%s,%s,%s,%s,%s,%s)'
            tx.execute(sql, values)
            print("数据插入成功")
        except Exception as e:
            print('数据插入错误:', e)

    def close_spider(self,spider):
        self.dbpool.close()

在settings.py中:

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
   'CSDN2.pipelines.Csdn2Pipeline': 300,
}
# Mysql数据库连接
MYSQL_HOST = 'localhost'
MYSQL_DB_NAME = 'db_name'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
MYSQL_PORT =3306

在爬取之前,我们先去navicat 里边先把table建好:
这里写图片描述
建好之后是这样:
这里写图片描述
之后我们在terminal中运行代码:
scrapy crawl commerce
产生的结果如下:
这里写图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫实例教程-代码,是一个指导如何使用Python编写爬虫的教程。下面我将用300字中文来回答这个问题。 这个教程的代码示例主要分为以下几个部分。 第一部分是爬虫的准备工作,包括安装Python和相关的第三方库,如requests、BeautifulSoup等。首先需要安装Python,并配置好相关环境变量。然后使用pip安装requests和BeautifulSoup库,这两个库是编写爬虫时常用的工具。 第二部分是使用requests库发送网络请求,获取网页的HTML源代码。首先需要导入requests库,然后使用get方法发送网络请求,传入要爬取的网页地址。之后可以通过response对象的text属性获取网页的HTML源代码。 第三部分是使用BeautifulSoup库解析HTML源代码,提取出需要的数据。首先需要导入BeautifulSoup库,然后将HTML源代码作为参数传入BeautifulSoup类的构造函数。之后可以使用BeautifulSoup对象的find、findAll等方法,根据HTML标签和属性来提取出需要的数据。 第四部分是保存爬取的数据。可以使用Python自带的文件操作函数,如open、write等,将爬取的数据保存到本地文件中。 最后,还可以通过循环、条件判断等控制结构,以及其他的Python编程技巧,对爬虫代码进行更加复杂的处理和优化。 总的来说,Python爬虫实例教程-代码提供了一个从安装环境到写爬虫代码的全过程。通过学习这些代码示例,可以掌握如何使用Python编写爬虫,以及一些常用的爬虫技巧和工具的使用。希望以上回答可以帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值