Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例
上周用了一周的時(shí)間學(xué)習(xí)了Python和Scrapy,實(shí)現(xiàn)了從0到1完整的網(wǎng)頁(yè)爬蟲實(shí)現(xiàn)。研究的時(shí)候很痛苦,但是很享受,做技術(shù)的嘛。
首先,安裝Python,坑太多了,一個(gè)個(gè)爬。由于我是windows環(huán)境,沒錢買mac, 在安裝的時(shí)候遇到各種各樣的問題,確實(shí)各種各樣的依賴。
安裝教程不再贅述。如果在安裝的過程中遇到 ERROR:需要windows c/c++問題,一般是由于缺少windows開發(fā)編譯環(huán)境,晚上大多數(shù)教程是安裝一個(gè)VisualStudio,太不靠譜了,事實(shí)上只要安裝一個(gè)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"
#設(shè)定域名
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: 動(dòng)態(tài)傳入?yún)?shù)
#命令行傳參寫法: 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):
#獲取隨機(jī)user_id,模擬發(fā)帖
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)
#獲取標(biāo)題
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開啟時(shí)被調(diào)用
def open_spider(self,spider):
pass
#sipder 關(guān)閉時(shí)被調(diào)用
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下的內(nèi)容了
以上這篇Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python爬蟲爬取指定內(nèi)容的解決方法
- python爬蟲爬取bilibili網(wǎng)頁(yè)基本內(nèi)容
- Python爬蟲爬取百度搜索內(nèi)容代碼實(shí)例
- python爬蟲開發(fā)之使用python爬蟲庫(kù)requests,urllib與今日頭條搜索功能爬取搜索內(nèi)容實(shí)例
- python爬取內(nèi)容存入Excel實(shí)例
- Python爬蟲爬取新浪微博內(nèi)容示例【基于代理IP】
- python爬取網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)換為PDF文件
- 基于Python實(shí)現(xiàn)web網(wǎng)頁(yè)內(nèi)容爬取的方法
相關(guān)文章
python保留小數(shù)點(diǎn)位數(shù)的多種方式(附demo)
在Python中,保留小數(shù)點(diǎn)后特定位數(shù)可以通過多種方式實(shí)現(xiàn),以下是幾種常見的方法,并附上相應(yīng)的代碼示例,使用字符串格式化,使用round()函數(shù),使用Decimal模塊和使用numpy庫(kù),文中通過代碼講解的非常詳細(xì),需要的朋友可以參考下2024-06-06
windows server 2008 r2 標(biāo)準(zhǔn)版安裝python環(huán)境
本文主要介紹了windows server 2008 r2 標(biāo)準(zhǔn)版安裝python環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Python程序打包exe報(bào)錯(cuò)的幾種解決方法
本文主要介紹了Python程序打包exe報(bào)錯(cuò)的幾種解決方法,文中通過幾種解決方法的介紹非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08
Python使用Selenium模塊模擬瀏覽器抓取斗魚直播間信息示例
這篇文章主要介紹了Python使用Selenium模塊模擬瀏覽器抓取斗魚直播間信息,涉及Python基于Selenium模塊的模擬瀏覽器登陸、解析、抓取信息,以及MongoDB數(shù)據(jù)庫(kù)的連接、寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Pytorch如何指定device(cuda or cpu)
這篇文章主要介紹了Pytorch如何指定device(cuda or cpu)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
python實(shí)現(xiàn)定時(shí)播放mp3
這篇文章主要介紹了python實(shí)現(xiàn)定時(shí)播放mp3,程序非常簡(jiǎn)單,功能很實(shí)用,主要是使用python實(shí)現(xiàn)了一首mp3歌每半小時(shí)播放一次,有需要的小伙伴可以參考下。2015-03-03
Python實(shí)現(xiàn)透明數(shù)字時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了一個(gè)使用 Python 和 Tkinter 庫(kù)實(shí)現(xiàn)的透明數(shù)字時(shí)鐘應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-02-02
Django執(zhí)行python?manage.py?makemigrations報(bào)錯(cuò)的解決方案分享
相信用過很多Django makemigrations的人都會(huì)遇到過makemigrations時(shí)會(huì)發(fā)生報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Django執(zhí)行python?manage.py?makemigrations報(bào)錯(cuò)的解決方案,需要的朋友可以參考下2022-09-09

