python中scrapy可以爬取多少数据_python中scrapy框架爬取携程景点数据

———————————————————————————————

[版权申明:本文系作者原创,转载请注明出处]

文章出处:https://blog.csdn.net/sdksdk0/article/details/82381198

作者:朱培      ID:sdksdk0

——————————————————————————————–

本文使用scrapy框架,python3.6进行爬取,主要获取的是携程上河南省的景点名称,地址,省市县,描述,图片地址信息等。首先通过搜索可以得到河南的网页地址为:http://piao.ctrip.com/dest/u-_ba_d3_c4_cf/s-tickets/P1/,然后以这个页面为起始位置开始爬取。将爬取的数据保存到mysql数据库中。

1、创建scrapy项目

scrapy startproject ctrip

2、创建 spider,首先进入ctrip文件夹

scrapy genspider scenic “ctrip.com”

3、settings.py文件中:

BOT_NAME = 'ctrip'

SPIDER_MODULES = ['ctrip.spiders']

NEWSPIDER_MODULE = 'ctrip.spiders'

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

}

DOWNLOADER_MIDDLEWARES = {

'ctrip.middlewares.UserAgentDownloadMiddleware': 543,

}

ITEM_PIPELINES = {

'ctrip.pipelines.DBPipeline': 300,

}

4、middlewares.py中

import random

class UserAgentDownloadMiddleware (object):

USER_AGENTS = [

"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",

"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",

"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",

"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",

"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",

"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",

"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",

"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"

]

def process_request(self,request,spider):

user_agent = random.choice(self.USER_AGENTS)

request.headers['User-Agent'] = user_agent

5、items.py

import scrapy

class ScenicItem(scrapy.Item):

province = scrapy.Field()

city = scrapy.Field()

county = scrapy.Field()

name = scrapy.Field()

scenic_url = scrapy.Field()

image_url = scrapy.Field()

address = scrapy.Field()

descript = scrapy.Field()

code = scrapy.Field()

6、scenic.py

# -*- coding: utf-8 -*-

import scrapy

import re

from ctrip.items import ScenicItem

class ScenicSpider(scrapy.Spider):

name = 'scenic'

allowed_domains = ['ctrip.com']

start_urls = ['http://piao.ctrip.com/dest/u-_ba_d3_c4_cf/s-tickets/P1/']

count = 0

def parse(self, response):

trs = response.xpath("//div[@id='searchResultContainer']//div[@class='searchresult_product04']")

for tr in trs:

ctrip_url = tr.xpath(".//div[1]/a/@href").get()

c1_url = ctrip_url.split("t/t")

scemic_num = c1_url[1].split(".")

scemic_num = scemic_num[0]

scenic_url = ""

image_url = tr.xpath(".//div[1]/a/img/@src").get()

address = tr.xpath(".//div[1]/div[@class='adress']//text()").get().strip()

address = re.sub(r"地址:", "", address)

descript = tr.xpath(".//div[1]/div[@class='exercise']//text()").get().strip()

descript = re.sub(r"特色:", "", descript)

name = tr.xpath(".//div[1]//h2/a/text()").get().strip()

cityinfo=address

province = "河南省"

city = ""

county = ""

if "省" in cityinfo:

matchObj = re.match(r'(.*)[?省](.+?)市(.+?)([县]|[区])', cityinfo, re.M | re.I)

if matchObj:

province = matchObj.group(1) + "省"

city = matchObj.group(2) + "市"

if "县" in cityinfo:

county = matchObj.group(3) + "县"

else:

county = matchObj.group(3) + "区"

else:

matchObj2 = re.match(r'(.*)[?省](.+?)市(.+?)市', cityinfo, re.M | re.I)

matchObj1 = re.match(r'(.*)[?省](.+?)市', cityinfo, re.M | re.I)

if matchObj2:

city = matchObj2.group(2) + "市"

county = matchObj2.group(3) + "市"

elif matchObj1:

city = matchObj1.group(2) + "市"

else:

matchObj1 = re.match(r'(.*)[?省](.+?)([县]|[区])', cityinfo, re.M | re.I)

if matchObj1:

if "县" in cityinfo:

county = matchObj1.group(2) + "县"

else:

county = matchObj1.group(2) + "区"

else:

matchObj = re.match(r'(.+?)市(.+?)([县]|[区])', cityinfo, re.M | re.I)

if matchObj:

city = matchObj.group(1) + "市"

if "县" in cityinfo:

county = matchObj.group(2) + "县"

else:

county = matchObj.group(2) + "区"

else:

matchObj = re.match(r'(.+?)市', cityinfo, re.M | re.I)

if matchObj:

city = matchObj.group(1) + "市"

else:

matchObj = re.match(r'(.+?)县', cityinfo, re.M | re.I)

if matchObj:

county = matchObj.group(1) + "县"

self.count += 1

code = "A" + str(self.count)

item = ScenicItem(name=name,province=province,city=city,county=county,address=address,descript=descript,

scenic_url=scenic_url,image_url=image_url,code=code)

yield item

next_url = response.xpath('//*[@id="searchResultContainer"]/div[11]/a[11]/@href').get()

if next_url:

yield scrapy.Request(url=response.urljoin(next_url), callback=self.parse,meta={})

7、pipelines.py,将数据保存到mysql数据库中

import pymysql

# 用于数据库存储

class DBPipeline(object):

def __init__(self):

# 连接数据库

self.connect = pymysql.connect(

host='localhost',

port=3306,

db='edu_demo',

user='root',

passwd='123456',

charset='utf8',

use_unicode=True)

# 通过cursor执行增删查改

self.cursor = self.connect.cursor();

def process_item(self, item, spider):

try:

# 查重处理

self.cursor.execute(

"""select * from a_scenic where ctrip_url = %s""",

item['scenic_url'])

# 是否有重复数据

repetition = self.cursor.fetchone()

# 重复

if repetition:

pass

else:

# 插入数据

self.cursor.execute(

"""insert into a_scenic(code,province, city, county, name ,description, ctrip_url,image_url,address,type)

value (%s,%s, %s, %s, %s, %s, %s, %s, %s, %s)""",

(item['code'],

item['province'],

item['city'],

item['county'],

item['name'],

item['descript'],

item['scenic_url'],

item['image_url'],

item['address'], '1'))

# 提交sql语句

self.connect.commit()

except Exception as error:

# 出现错误时打印错误日志

print(error)

return item

8、start.py

from scrapy import cmdline

cmdline.execute("scrapy crawl scenic".split())

9、运行start.py即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python灰色关联度分析代码_灰色关联分析法步骤 - osc_uwnmtz9n的个人空间 - OSCHINA - 中文开源技术交流社区...

https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flagdefault&sxts1538121950212利用灰色关联分析的步骤是:1.根据分析目的确定分析指标体系,收集分析数据。设n个数据序列形成如下矩阵:其中m为指标的个数&a…

aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍

从JDK 7版本开始,Java新加入的文件和网络io特性称为nio2(new io 2, 因为jdk1.4中已经有过一个nio了),包含了众多性能和功能上的改进,其中最重要的部分,就是对异步io的支持,称为Java AIO(asynchronous IO)。因为AIO的实…

centos mysql 5.5 art_Linux CentOS6.5下编译安装MySQL 5.5.51''''

一、编译安装MySQL前的准备工作安装编译源码所需的工具和库yum install gcc gcc-c ncurses-devel perl安装cmake,从http://www.cmake.org下载源码并编译安装wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gztar -xzvf cmake-2.8.10.2.tar.gzcd cmake-2.…

java修改默认字符编码_设置默认的Java字符编码?

如何以编程方式正确设置JVM(1.5.x)使用​​的默认字符编码?我已经读过-Dfile.encoding 以前是以往的方式去为旧的JVM …我没有那么奢侈的原因,我不会进入。我努力了:System.setProperty("file.encoding", "UTF-8");并且属…

java api 第一个类是_JAVA常用API:String 类的常用方法

字符串是一个对象,有很多方法可以使用1. length();返回字符串的长度String str "abcd";int len str.length();2. isEmpty(); 仅当当length()为0时返回true,否则返回falseboolean b str.isEmpty();3. getBytes();返回字符串中每个字符的ASCII码(使用平台…

关于java内容_关于java一些概念性的内容

PO:persistant object持久对象最形象的理解就是一个PO就是数据库中的一条记录。好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。--------------------------------------------------------------------------------BO:busin…

java订单类_基于Java创建一个订单类代码实例

这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下需求描述定义一个类,描述订单信息订单id订单所属用户(用户对象)订单所包含的商品(不定数量个商品对…

java请假审批怎么实现_java实现请假时间判断

笔记:需求分析:每周上班6天夏季早上8:30-12:00下午14:00-17:30冬季早上8:30-12:00下午14:30-18:00请假最低为半天按照上午8:00-12:00,下午14:00-18:00计算,包括了夏季和冬季时间,规律分布如下public String getDouble(HttpServletRequest request) throws ParseException {//参…

mariadb mysql 5.6_MySQL / MariaDB 5.5 升级到 MySQL 5.6

RHEL 及 CentOS 7 默认的资库系统是 MariaDB 5.5 (等同 MySQL 5.5), 虽然现时 MySQL 最新版是 5.7, 但一般上升级都建议一级一级上, 而 MySQL 5.6 比 5.5 也提高了效能及提供更多功能, 以下是在 RHEL 及 CentOS 从原来的 MySQL 5.5 或 MariaDB 5.5, 升级到 MySQL 5.6 的步骤。1…

iText报表Java_(例)Java生成PDF报表 iText

// 导入IO库类import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;// 导入 PO&#x…

mysql update修改数据_MySQL UPDATE:修改数据(更新数据)

在 MySQL 中,可以使用 UPDATE 语句来修改、更新一个或多个表的数据。UPDATE 语句的基本语法使用 UPDATE 语句修改单个表,语法格式为:UPDATE SET 字段 1值 1 [,字段 2值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句]语法说明如下&#xf…

java堆内存 数据结构_JAVA内存区域

首先解释下内存溢出和内存泄露之间的区别,为后面的学习做些铺垫:1、内存溢出和内存泄露的区别和联系内存溢出 out of memory:是指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型…

java jsp的指令_[javaEE] jsp的指令

jsp的指令:jsp的指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp页面中的其他部分页面头部的page指令pageEncoding"utf-8"%>配置错误页面:web.xml500/500.jsp404/404.jsp…

JAVA不能满屏_java – 全屏幕视频,不拉伸视频

像这样,你可以自己设置视频的属性。使用SurfaceView(给你更多的视图控制),将其设置为fill_parent以匹配整个屏幕android:orientation"vertical"android:layout_width"match_parent"android:layout_height"fill_parent">…

java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...

我收到此错误(在标题中).我不确定为什么,请帮忙.代码如下:public static String decryptRSA(Context mContext, byte[] message) throws Exception {InputStream in mContext.getResources().openRawResource(R.raw.publicrsakey);X509EncodedKeySpec x509EncodedK…

正版我的世界怎么下载java_mcjava正版下载-mc我的世界java安卓正式版极速下载v1.0.1 - 趣趣手游网...

mc我的世界java安卓正式版带你体验最为精彩的多人联机对战玩法,游戏专为java系列打造,在游戏的部分特性上有着各种的提升,以及各种专属的表达,比基岩版能多一些不同的玩法,在这里有着各种不同的玩法以及模式等待你的加…

java原子整数_多线程(四、原子类-AtomicInteger)

案例10个线程并发累加一个整数,每个线程累加1000,保证线程安全Unsafe类,来源于sun.misc包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。package com.jane;import java.util.ArrayList;imp…

java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...

请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项。要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态;选择Exit项能够…

adurnio 单片机_单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码,proteus仿真文件...

//------------------------------51单片机头文件#include//各数字的数码管段码(共阴)unsigned char code DSY_CODE[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示数组{0,1,2,3,4,5,6,7,8,9}sbit CLKP3^3; //时钟信号sbit STP3^6; //启动信号,由…

java 极客_Java极客思维

​开篇介绍大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java一些消息中间件高频面试题进行分享。通知:公众号【Java极客思维】正在送书福…