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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
3分钟学会一个Python小技巧
Nov 23 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python OrderedDict字典排序方法详解
May 21 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php实现插入排序
2015/03/29 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
python使用正则表达式提取网页URL的方法
2015/05/26 Python
python实时监控cpu小工具
2018/06/21 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
opencv与numpy的图像基本操作
2019/03/08 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
django 模型字段设置默认值代码
2020/07/15 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
医科大学毕业生自荐信
2014/02/03 职场文书
小学综合实践活动总结
2014/07/07 职场文书
街道务虚会发言材料
2014/10/20 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
sass 常用备忘案例详解
2021/09/15 HTML / CSS
Redis命令处理过程源码解析
2022/02/12 Redis
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电