Python爬虫框架Scrapy学习笔记原创
生活随笔
收集整理的這篇文章主要介紹了
Python爬虫框架Scrapy学习笔记原创
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
字號 scrapy
[TOC]
開始scrapy安裝
首先手動安裝windows版本的Twisted
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
pip install Twisted-18.4.0-cp36-cp36m-win_amd64.whl
安裝scrapy
pip install -i https://pypi.douban.com/simple/ scrapy
windows系統額外需要安裝pypiwin32
pip install -i https://pypi.douban.com/simple pypiwin32
新建項目
開始一個項目
E:\svnProject> scrapy startproject TestSpider生成一個新的爬蟲(generate)
E:\svnProject> cd TestSpider E:\svnProject\TestSpider> scrapy genspider dongfeng www.dongfe.com啟動一個爬蟲
E:\svnProject\TestSpider> scrapy crawl dongfengSHELL模式
> scrapy shell http://www.dongfe.com/ # 命令行調試該網頁pycharm調試啟動文件
E:\svnProject\TestSpider> vim main.py import sys import os from scrapy.cmdline import execute BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(BASE_DIR) # scrapy crawl dongfeng execute(["scrapy", "crawl", "dongfeng"])項目基本配置
E:\svnProject\TestSpider\TestSpider> vim settings.py ROBOTSTXT_OBEY = False # 不要遵循網站robots文件 XPATH| /body | 選出當前選擇器的根元素body |
| /body/div | 選取當前選擇器文檔的根元素body的所有div子元素 |
| /body/div[1] | 選取body根元素下面第一個div子元素 |
| /body/div[last()] | 選取body根元素下面最后一個div子元素 |
| /body/div[last()-1] | 選取body根元素下面倒數第二個div子元素 |
| //div | 選取所有div子元素(不論出現在文檔任何地方) |
| body//div | 選取所有屬于body元素的后代的div元素(不論出現在body下的任何地方) |
| /body/@id | 選取當前選擇器文檔的根元素body的id屬性 |
| //@class | 選取所有元素的class屬性 |
| //div[@class] | 選取所有擁有class屬性的div元素 |
| //div[@class='bold'] | 選取所有class屬性等于bold的div元素 |
| //div[contains(@class,'bold')] | 選取所有class屬性包含bold的div元素 |
| /div/* | 選取當前文檔根元素div的所有子元素 |
| //* | 選取文檔所有節點 |
| //div[@*] | 獲取所有帶屬性的div元素 |
| //div/a | //div/p | 選取所有div元素下面的子元素a和子元素p(并集) |
| //p[@id='content']/text() | 選取id為content的p標簽的內容(子元素的標簽和內容都不會獲取到) |
>?注意:?XPATH在選擇時,參考的是HTML源碼,而不是JS加載后的HTML代碼
操作例子
title_selector = response.xpath("//div[@class='entry-header']/h1/text()") title_str = title_selector.extract()[0] CSS選擇器| * | 選擇所有節點 |
| #container | 選擇Id為container的節點 |
| .container | 選取所有包含container類的節點 |
| li a | 選取所有li下的所有后代a元素(子和孫等所有的都會選中) |
| ul + p | 選取ul后面的第一個相鄰兄弟p元素 |
| div#container > ul | 選取id為container的div的所有ul子元素 |
| ul ~ p | 選取與ul元素后面的所有兄弟p元素 |
| a[title] | 選取所有有title屬性的a元素 |
| a[href='http://taobao.com'] | 選取所有href屬性等于http://taobao.com的a元素 |
| a[href*='taobao'] | 選取所有href屬性包含taobao的a元素 |
| a[href^='http'] | 選取所有href屬性開頭為http的a元素 |
| a[href$='.com'] | 選取所有href屬性結尾為.com的a元素 |
| input[type=radio]:checked | 選取選中的radio的input元素 |
| div:not(#container) | 選取所有id非container的div元素 |
| li:nth-child(3) | 選取第三個li元素 |
| tr:nth-child(2n) | 選取偶數位的tr元素 |
| a::attr(href) | 獲取所有a元素的href屬性值 |
操作例子
h1_selector = response.css(".container h1::text") # 選取h1標題的內容 h1_str = h1_selector.extract_first() # 取出數組第一個,如果沒有為空 爬蟲爬取某網站文章列表例子
>>> vim ArticleSpider/spiders/jobbole.py import scrapy from scrapy.http import Request from urllib import parse import re from ArticleSpider.items import ArticleItem from ArticleSpider.utils.common import get_md5 # url轉md5 class JobboleSpider(scrapy.Spider): name = 'jobbole' allowed_domains = ['blog.jobbole.com'] start_urls = ['http://blog.jobbole.com/all-posts/'] def parse(self, response): """ 文章列表頁的文章鏈接解析 :param response: :return: """ css = "#archive > .post > .post-thumb > a" article_urls_selector = response.css(css) # 獲取當前列表頁所有文章的鏈接 for article_url_selector in article_urls_selector: head_img_url = article_url_selector.css("img::attr(src)").extract_first() # 封面URL head_img_full_url = parse.urljoin(response.url, head_img_url) # 封面圖片完整URL article_url = article_url_selector.css("a::attr(href)").extract_first("") # 文章URL article_full_url = parse.urljoin(response.url, article_url) # 智能的拼接URL,相對地址直接對接;絕對地址只取出域名對接;完全地址不對接,直接獲取。 yield Request(url=article_full_url, callback=self.article_parse, meta={"head_img_full_url": head_img_full_url}) # 請求文章詳情頁并設置回調函數解析內容和meta傳參 next_url = response.css(".next.page-numbers::attr(href)").extract_first("") if next_url: yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse) # 下一頁文章列表使用遞歸 def article_parse(self, response): """ 文章詳情頁的內容解析 :param response: :return: """ title = response.css(".grid-8 .entry-header > h1::text").extract_first("") # 標題內容轉載于:https://www.cnblogs.com/xyou/p/9340190.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python爬虫框架Scrapy学习笔记原创的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到父母吸毒有什么征兆
- 下一篇: 梦到自己弟弟死了是什么预兆