scrapy实战8关于数据异步写入mysql:

环境:python3

爬取网址:腾讯社招(http://hr.tencent.com/position.php?keywords=&tid=0&start=0#a)总共2202条数据

pipelines.py

 1 from twisted.enterprise import adbapi
 2 import pymysql
 3 import pymysql.cursors
 4
 5
 6 class MysqlTwistedPipeline(object):
 7     def __init__(self,dbpool):
 8         self.dbpool=dbpool
 9
10     @classmethod
11     def from_settings(cls,settings):
12         dbpool=adbapi.ConnectionPool("pymysql",host=settings["MYSQL_HOST"],db=settings["MYSQL_DBNAME"],user=settings["MYSQL_USER"],password=settings["MYSQL_PASSWORD"],charset="utf8", cursorclass=pymysql.cursors.DictCursor,
13             use_unicode=True)
14         return cls(dbpool)
15
16     def process_item(self,item,spider):
17         # 使用twisted将mysql插入变成异步执行
18         self.dbpool.runInteraction(self.do_insert,item)
19
20
21     def do_insert(self,cursor,item):
22         # 执行具体的插入
23         # 根据不同的item 构建不同的sql语句并插入到mysql中
24         insert_sql, params = item.get_insert_sql()
25         cursor.execute(insert_sql, params)

items.py

 1 import scrapy
 2
 3
 4 class TencentItem(scrapy.Item):
 5
 6     positionname=scrapy.Field()
 7     positionlink=scrapy.Field()
 8     positionType=scrapy.Field()
 9     positionNum=scrapy.Field()
10     positionLocation=scrapy.Field()
11     publishTime=scrapy.Field()
12
13
14     def get_insert_sql(self):
15         insert_sql="""
16         insert into tencent(positionname,positionlink,positionType,positionNum,positionLocation,publishTime)
17         VALUES (%s,%s,%s,%s,%s,%s)
18
19         """
20         params=(
21             self[‘positionname‘], self[‘positionlink‘], self[‘positionType‘], self[‘positionNum‘],
22             self[‘positionLocation‘], self[‘publishTime‘]
23         )
24         return insert_sql,params
25     

settings.py

BOT_NAME = ‘tencent‘

SPIDER_MODULES = [‘tencent.spiders‘]
NEWSPIDER_MODULE = ‘tencent.spiders‘

ROBOTSTXT_OBEY = False

(不用分布式可忽略下面三项)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER_PERSIST = True

DOWNLOAD_DELAY = 2

DEFAULT_REQUEST_HEADERS = {
  ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0‘,
  ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
   #‘Accept-Language‘: ‘en‘,
}

ITEM_PIPELINES = {
       ‘scrapy_redis.pipelines.RedisPipeline‘:400,(不用分布式可忽略)
      ‘tencent.pipelines.MysqlTwistedPipeline‘: 300,
}
REDIS_HOST = ‘172.21.118.56‘(分布式主机ip 不用分布式可忽略)
REDIS_PORT = 6379(不用分布式可忽略)

MYSQL_HOST = "127.0.0.1"
MYSQL_DBNAME = "tencent"(自己数据库名字)
MYSQL_USER = "usrername"(用户名)
MYSQL_PASSWORD = "userpassword"(密码)

spiders/Tencent.py

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule
from scrapy_redis.spiders import RedisCrawlSpider
from tencent.items import TencentItem

class TencentSpider(RedisCrawlSpider):
    name = "Tencent"
    allowed_domains = ["tencent.com"]
    redis_key = ‘TencentSpider:start_urls‘

    page_link=LinkExtractor(allow=(r"start=\d+"))

    rules=[
            Rule(page_link,callback = "parseContent",follow=True)
    ]

    def parseContent(self, response):
        list=response.xpath(‘//tr[@class="even"] | //tr[@class="odd"]‘)
        for infos in list:
            item=TencentItem()
            item[‘positionname‘]=infos.xpath("./td[1]/a/text()").extract()[0]
            item[‘positionlink‘]=infos.xpath("./td[1]/a/@href").extract()[0]
            item[‘positionType‘]=infos.xpath("./td[2]/text()").extract()
            item[‘positionNum‘]=infos.xpath("./td[3]/text()").extract()[0]
            item[‘positionLocation‘]=infos.xpath("./td[4]/text()").extract()[0]
            item[‘publishTime‘]=infos.xpath("./td[5]/text()").extract()[0]

            yield item
时间: 2024-10-01 09:39:45

scrapy实战8关于数据异步写入mysql:的相关文章

HTTP协议与使用Python获取数据并写入MySQL

一.Http协议 二.Https协议 三.使用Python获取数据 (1)urlib (2)GET请求 (3)POST请求 四.爬取豆瓣电影实战 1.思路 (1)在浏览器中输入https://movie.douban.com/j/search_tags?type=movie会得到显示的电影的分类标签,下面以"热门"为例 {"tags":["热门","最新","经典","可播放",&quo

scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)

  python版本  python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www.zhihu.com/signup?next=%2F)这个页面, 爬取知乎,首先要完成登录操作,登陆的时候观察往那个页面发送了post或者get请求.可以利用抓包工具来获取登录时密码表单等数据的提交地址. 1.利用抓包工具,查看用户名密码数据的提交地址页就是post请求,将表单数据提交的网址,经过查看

用scrapy爬取ttlsa博文相关数据存储至mysql

运维生存时间这个博客内容还是比较详尽的,对与运维技术人员的我来说,是偶尔溜达进来的地方,从中也学习到不少知识,感谢博主的奉献! 这段时间我就通过scrapy来收集下此博客内文章的相关数据,供以后需要从中提取我认为值得看的文章作为数据依据. 今天,要做的事就是把数据先抓取出来,后期再将其数据存储起来. 首先通过命令scrapy genspider ttlsa www.ttlsa.com创建一个蜘蛛程序应用名为ttlsa 其次在ttlsa.py下编写如下代码. # -*- coding: utf-8

android 写行为日志到SD卡 并发处理 异步写入数据到文件不影响界面响应时间

公司在做一个项目 要求记录用户行为,写行为日志文件到SD卡.实现思想 不影响界面用户体验,要时时记录日志 不能漏掉. 1.并发处理日志 写一个类负责管理各个线程传过来的日志数据,日志数据放在队列中等待写线程去处理.这里每次添加一条日志数据都会检查写日志线程是否在工作,同时为了并发处理传过来的数据采用synchronized 同步: ConcurrentLinkedQueue 是基于链接节点的.线程安全的队列.并发访问不需要同步.因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的

PHP如何通过SQL语句将数据写入MySQL数据库呢?

1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect("localhost","root","");//连接MySQLmysql_select_db("hello");//选择数据库?> 当然,前提是已经安装WEB服务器.PHP和MySQL,并且建立MySQL表“webjx” mys

php从memcache读取数据再批量写入mysql的方法

这篇文章主要介绍了php从memcache读取数据再批量写入mysql的方法,可利用memcache缓解服务器读写压力,并实现数据库数据的写入操作,非常具有实用价值,需要的朋友可以参考下. 用 Memcache 可以缓解 php和数据库压力下面代码是解决高负载下数据库写入瓶颈问题,遇到最实用的:写入ip pv uv的时候,用户达到每分钟几万访问量,要记录这些数据,实时写入数据库必定奔溃. 用以下技术就能解决,还有如用户注册,同一时间断内,大量用户注册,可以缓存后一次性写入到数据库,代码如下 pu

Scrapy爬取慕课网(imooc)所有课程数据并存入MySQL数据库

爬取目标:使用scrapy爬取所有课程数据,分别为 1.课程名 2.课程简介 3.课程等级 4.学习人数 并存入MySQL数据库  (目标网址  http://www.imooc.com/course/list) 一.导出数据文件到本地 1.新建imooc项目 1 scrapy startproject imooc 2.修改 items.py,添加项目item 1 from scrapy import Item,Field 2 class ImoocItem(Item): 3 Course_na

将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy

将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy [python] view plain copy print? import pandas as pd from sqlalchemy import create_engine ##将数据写入mysql的数据库,但需要先通过sqlalchemy.create_engine建立连接,且字符编码设置为utf8,否则有些latin字符不能处理 yconnect = create_engine('mysql+mysql

用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢nodejs路由和Ajax之间的数据传输,也就是表单提交,然后在用nodejs把数据写入mysql数据库 用到的东西比较多,但是还是很有趣的 1.安装node.js 安装node.js,直接去官网下载然后根据需求点击下一步就好了 Node.js安装包及源码下载地址为:https://nodejs.org