Python下使用Scrapy爬取网页内容的实例


Posted in Python onMay 21, 2018

上周用了一周的时间学习了Python和Scrapy,实现了从0到1完整的网页爬虫实现。研究的时候很痛苦,但是很享受,做技术的嘛。

首先,安装Python,坑太多了,一个个爬。由于我是windows环境,没钱买mac, 在安装的时候遇到各种各样的问题,确实各种各样的依赖。

安装教程不再赘述。如果在安装的过程中遇到 ERROR:需要windows c/c++问题,一般是由于缺少windows开发编译环境,晚上大多数教程是安装一个VisualStudio,太不靠谱了,事实上只要安装一个WindowsSDK就可以了。

下面贴上我的爬虫代码:

爬虫主程序:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from zjf.FsmzItems import FsmzItem
from scrapy.selector import Selector
# 圈圈:情感生活
class MySpider(scrapy.Spider):
 #爬虫名
 name = "MySpider"
 #设定域名
 allowed_domains = ["nvsheng.com"]
 #爬取地址
 start_urls = []
 #flag
 x = 0
 #爬取方法
 def parse(self, response):
  item = FsmzItem()
  sel = Selector(response)
  item['title'] = sel.xpath('//h1/text()').extract()
  item['text'] = sel.xpath('//*[@class="content"]/p/text()').extract()
  item['imags'] = sel.xpath('//div[@id="content"]/p/a/img/@src|//div[@id="content"]/p/img/@src').extract()
  if MySpider.x == 0:
   page_list = MySpider.getUrl(self,response)
   for page_single in page_list:
    yield Request(page_single)
  MySpider.x += 1
  yield item
 #init: 动态传入参数
 #命令行传参写法: scrapy crawl MySpider -a start_url="http://some_url"
 def __init__(self,*args,**kwargs):
  super(MySpider,self).__init__(*args,**kwargs)
  self.start_urls = [kwargs.get('start_url')]
 def getUrl(self, response):
  url_list = []
  select = Selector(response)
  page_list_tmp = select.xpath('//div[@class="viewnewpages"]/a[not(@class="next")]/@href').extract()
  for page_tmp in page_list_tmp:
   if page_tmp not in url_list:
    url_list.append("http://www.nvsheng.com/emotion/px/" + page_tmp)
  return url_list

PipeLines类

# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
from zjf import settings
import json,os,re,random
import urllib.request
import requests, json
from requests_toolbelt.multipart.encoder import MultipartEncoder
class MyPipeline(object):
 flag = 1
 post_title = ''
 post_text = []
 post_text_imageUrl_list = []
 cs = []
 user_id= ''
 def __init__(self):
  MyPipeline.user_id = MyPipeline.getRandomUser('37619,18441390,18441391')
 #process the data
 def process_item(self, item, spider):
  #获取随机user_id,模拟发帖
  user_id = MyPipeline.user_id
  #获取正文text_str_tmp
  text = item['text']
  text_str_tmp = ""
  for str in text:
   text_str_tmp = text_str_tmp + str
  # print(text_str_tmp)
  #获取标题
  if MyPipeline.flag == 1:
   title = item['title']
   MyPipeline.post_title = MyPipeline.post_title + title[0]
  #保存并上传图片
  text_insert_pic = ''
  text_insert_pic_w = ''
  text_insert_pic_h = ''
  for imag_url in item['imags']:
   img_name = imag_url.replace('/','').replace('.','').replace('|','').replace(':','')
   pic_dir = settings.IMAGES_STORE + '%s.jpg' %(img_name)
   urllib.request.urlretrieve(imag_url,pic_dir)
   #图片上传,返回json
   upload_img_result = MyPipeline.uploadImage(pic_dir,'image/jpeg')
   #获取json中保存图片路径
   text_insert_pic = upload_img_result['result']['image_url']
   text_insert_pic_w = upload_img_result['result']['w']
   text_insert_pic_h = upload_img_result['result']['h']
  #拼接json
  if MyPipeline.flag == 1:
   cs_json = {"c":text_str_tmp,"i":"","w":text_insert_pic_w,"h":text_insert_pic_h}
  else:
   cs_json = {"c":text_str_tmp,"i":text_insert_pic,"w":text_insert_pic_w,"h":text_insert_pic_h}
  MyPipeline.cs.append(cs_json)
  MyPipeline.flag += 1
  return item
 #spider开启时被调用
 def open_spider(self,spider):
  pass
 #sipder 关闭时被调用
 def close_spider(self,spider):
  strcs = json.dumps(MyPipeline.cs)
  jsonData = {"apisign":"99ea3eda4b45549162c4a741d58baa60","user_id":MyPipeline.user_id,"gid":30,"t":MyPipeline.post_title,"cs":strcs}
  MyPipeline.uploadPost(jsonData)
 #上传图片
 def uploadImage(img_path,content_type):
  "uploadImage functions"
  #UPLOAD_IMG_URL = "http://api.qa.douguo.net/robot/uploadpostimage"
  UPLOAD_IMG_URL = "http://api.douguo.net/robot/uploadpostimage"
  # 传图片
  #imgPath = 'D:\pics\http___img_nvsheng_com_uploads_allimg_170119_18-1f1191g440_jpg.jpg'
  m = MultipartEncoder(
   # fields={'user_id': '192323',
   #   'images': ('filename', open(imgPath, 'rb'), 'image/JPEG')}
   fields={'user_id': MyPipeline.user_id,
     'apisign':'99ea3eda4b45549162c4a741d58baa60',
     'image': ('filename', open(img_path , 'rb'),'image/jpeg')}
  )
  r = requests.post(UPLOAD_IMG_URL,data=m,headers={'Content-Type': m.content_type})
  return r.json()
 def uploadPost(jsonData):
  CREATE_POST_URL = http://api.douguo.net/robot/uploadimagespost
reqPost = requests.post(CREATE_POST_URL,data=jsonData)
def getRandomUser(userStr):
  user_list = []
  user_chooesd = ''
  for user_id in str(userStr).split(','):
   user_list.append(user_id)
  userId_idx = random.randint(1,len(user_list))
  user_chooesd = user_list[userId_idx-1]
  return user_chooesd

字段保存Items类

# -*- coding: utf-8 -*- 
 
# Define here the models for your scraped items 
# 
# See documentation in: 
# http://doc.scrapy.org/en/latest/topics/items.html 
 
import scrapy 
 
class FsmzItem(scrapy.Item): 
 # define the fields for your item here like: 
 # name = scrapy.Field() 
 title = scrapy.Field() 
 #tutor = scrapy.Field() 
 #strongText = scrapy.Field() 
 text = scrapy.Field() 
 imags = scrapy.Field()

在命令行里键入

scrapy crawl MySpider -a start_url=www.aaa.com

这样就可以爬取aaa.com下的内容了

以上这篇Python下使用Scrapy爬取网页内容的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python进程类subprocess的一些操作方法例子
Nov 22 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python如何为图片添加水印
Nov 25 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
学习Django知识点分享
Sep 11 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
python如何做代码性能分析
Apr 26 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 #Python
对python抓取需要登录网站数据的方法详解
May 21 #Python
深入浅析python 中的匿名函数
May 21 #Python
python3 selenium 切换窗口的几种方法小结
May 21 #Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 #Python
pytorch cnn 识别手写的字实现自建图片数据
May 20 #Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 #Python
You might like
杏林同学录(四)
2006/10/09 PHP
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
javascript如何创建对象
2016/08/29 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python实现ip查询示例
2014/03/26 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python字符串逐字符或逐词反转方法
2015/05/21 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
python生成带有表格的图片实例
2019/02/03 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
Python decimal模块使用方法详解
2020/06/08 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
2015年初三班主任工作总结
2015/05/21 职场文书
电影雷锋观后感
2015/06/10 职场文书
详细介绍python类及类的用法
2021/05/31 Python