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服务器端收发请求的实现代码
Sep 29 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
python和php哪个容易学
Jun 19 Python
Python通过字典映射函数实现switch
Nov 06 Python
使用django自带的user做外键的方法
Nov 30 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
竞选演讲稿范文
2013/12/28 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
安全生产投入制度
2014/01/29 职场文书
贷款委托书怎么写
2014/08/02 职场文书
撤诉状格式范本
2015/05/19 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
开场白怎么写
2015/06/01 职场文书
胡桃夹子观后感
2015/06/11 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
小程序实现侧滑删除功能
2022/06/25 Javascript