热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2017.07.28Python网络爬虫之爬虫实战重新梳理

1.用Chrome浏览器重新检查网站元素:切换到Network界面选择右边的XHR过滤(XHR时XMLHttpRequest对象,一般Ajax请求的数据都是结构化数据),这样就剩下了为数不多的几个请求

1.用Chrome浏览器重新检查网站元素:切换到Network界面

选择右边的XHR过滤(XHR时XMLHttpRequest对象,一般Ajax请求的数据都是结构化数据),这样就剩下了为数不多的几个请求,剩下的就靠我们自己一个一个的检查吧

通过分析每个接口返回的request和response信息,检查发现findFilm接口,是我们需要的接口!

 

2.XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过Javascript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件. 

 

3.Request中得参数很简单,根据英文意思就可以猜出意义,由于我们要抓取所有电影的信息,所以不需要定制这些参数,后面直接将这些参数post给接口就行了

在Response中可以获得到的有用数据有两个:所有电影信息的列表data,data列表中得对象都有如下图所示的json格式,它也正是我们需要的电影信息的数据

 

 

 

4.Scrapy编码:

(1)定义Item:

如下:我只选择了一些我认为有用的key(也就是有用的信息)

import scrapy


class TodaymovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
filmName=scrapy.Field() #电影名字
filmType=scrapy.Field()
language=scrapy.Field()
ratingDescription=scrapy.Field()
status=scrapy.Field()
revision=scrapy.Field()


(2)Spider编写:
# -*- coding: utf-8 -*-

import urllib2
import os
import re
import sys
import codecs
import json
from scrapy import Spider
from scrapy.selector import Selector
from todayMovie.items import TodaymovieItem
from scrapy.http import FormRequest
from scrapy.http import Request
from scrapy.utils.response import open_in_browser
reload(sys)
sys.setdefaultencoding('utf8')


class HqumoviespiderSpider(Spider):
name = 'HQUMovieSpider'
allowed_domains = ['jycinema.com']
custom_settings = {
"DEFAULT_REQUEST_HEADERS":{
'authority':'www.jycinema.com',
'accept':'application/json, text/Javascript, */*; q=0.01',
'accept-encoding':'gzip, deflate',
'accept-language':'zh-CN,zh;q=0.8,en;q=0.6',
'origin':'http://www.jycinema.com',
'referer':'http://www.jycinema.com/html/default/index.html',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'x-requested-with':'XMLHttpRequest',
'COOKIE':'JSESSIOnID=3E90F1084862B8B2F08DB25D1008BD2E; Hm_lvt_62d04228e1f84e012c1d9c0227f722c3=1500983200,1501070756; Hm_lpvt_62d04228e1f84e012c1d9c0227f722c3=1501246698'
},"ITEM_PIPELINES":{
'todayMovie.pipelines.TodaymoviePipeline':300   
 #ITEM_PIPELINES,自定义管道模块,当item获取到数据后会调用你指定的管道处理命令,这个后面会贴上代码,因为这个不影响本文的内容,数据的处理可以因人而异。

}
}

def start_requests(self):
url="http://www.jycinema.com/frontUIWebapp/appserver/cinCinemaFilmViewService/findFilm"
requests = []
for i in reload(1,8):
formdata={
"status":"HOT",
"cityName":"泉州市",
"type":"queryFilm",
"DBType":"mongoDB",
"channelCode":"J0002",
"channelId":"3"
}
request = FormRequest(url,callback=self.parse_movie,formdata=formdata)
requests.append(request)
return requests

def parse_movie(self, response):
jsOnBody=json.loads(response.body.decode('gbk').encode('utf-8'))
movies=jsonBody['isActivity']['data']
movieItems=[]
for dict in movies:
movieItem=TodaymovieItem()
movieItem['filmName']=dict['filmName']
movieItem['filmType']=dict['filmType']
movieItem['language']=dict['language']
movieItem['ratingDescription']=dict['ratingDescription']
movieItem['status']=dict['status']
movieItem['revision']=dict['revision']
movieItems.append(movieItem)

return movieItems


Spider部分代码解析:
(1)

  

(2)

(3)

 

5.数据后处理:数据后处理的代码写在pipelines.py文件中

 

import time

class TodaymoviePipeline(object):
def process_item(self, item, spider):
now=time.strftime('%Y-%m-%d',time.localtime())
fileName='HQU'+now+'.txt'
with open(fileName,'a') as fp:
fp.write(item['filmName'][0].encode('utf-8')+'\n\n')

return item

代码详解:
这个脚本没什么,比较简单,就是把当日的年月日抽取出来当成文件名的一部分,然后把HQUMovieSpdier.py中获取项的内容输入到该文件中,这个脚本只需要注意两点:
(1)open函数创建文件时必须是以追加的形式创建,也就是说open函数的第二个参数必须是a,因为HQUMovieSpider返回的是一个item列表items,
这里写入的文件只能是一个一个iten写入,如果open函数第二个参数是w,造成的后果就是先擦除前面写入的内容
(2)保存文件中的内容如果含有汉字就必须转换为utf-8码,汉字的unicode码保存到文件中正常后无法识别



 6.分派任务的settings.py:

 

 

7.执行这个Scrapy爬虫:只要在todayMovie项目下的任意目录下执行如下命令:

scrapy crawl HQUMovieSpider

 

8.执行报错!!!!这是一个关于获取json数据的错误?这篇博文中解决不了,请看下一篇博文吧,哎哎哎哎!!!!好难啊,好烦啊!

 


推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
采蘑菇的小熙熙_395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有