Python爬蟲框架Scrapy學習筆記原創

字號
scrapy

[TOC]

開始

scrapy安裝

  1. 首先手動安裝windows版本的Twisted

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

    pip install Twisted-18.4.0-cp36-cp36m-win_amd64.whl

  2. 安裝scrapy

    pip install -i https://pypi.douban.com/simple/ scrapy

  3. 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 dongfeng

SHELL模式

> 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

600. 不含連續1的非負整數

600. 不含連續1的非負整數 給定一個正整數 n&#xff0c;找出小于或等于 n 的非負整數中&#xff0c;其二進制表示不包含 連續的1 的個數。 示例 1:輸入: 5 輸出: 5 解釋: 下面是帶有相應二進制表示的非負整數< 5&#xff1a; 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101…

高可用性、負載均衡的mysql集群解決方案

2019獨角獸企業重金招聘Python工程師標準>>> 一、為什么需要mysql集群&#xff1f; 一個龐大的分布式系統的性能瓶頸中&#xff0c;最脆弱的就是連接。連接有兩個&#xff0c;一個是客戶端與后端的連接&#xff0c;另一個是后端與數據庫的連接。簡單如圖下兩個藍色框…

Django的model查詢操作 與 查詢性能優化

Django的model查詢操作 與 查詢性能優化 1 如何 在做ORM查詢時 查看SQl的執行情況 (1) 最底層的 django.db.connection 在 django shell 中使用 python manage.py shell>>> from django.db import connection >>> Books.objects.all() >>> connect…

887. 雞蛋掉落

887. 雞蛋掉落 給你 k 枚相同的雞蛋&#xff0c;并可以使用一棟從第 1 層到第 n 層共有 n 層樓的建筑。 已知存在樓層 f &#xff0c;滿足 0 < f < n &#xff0c;任何從 高于 f 的樓層落下的雞蛋都會碎&#xff0c;從 f 樓層或比它低的樓層落下的雞蛋都不會破。 每次…

678. 有效的括號字符串

678. 有效的括號字符串 給定一個只包含三種字符的字符串&#xff1a;&#xff08; &#xff0c;&#xff09; 和 *&#xff0c;寫一個函數來檢驗這個字符串是否為有效字符串。有效字符串具有如下規則&#xff1a; 任何左括號 ( 必須有相應的右括號 )。任何右括號 ) 必須有相應…

Faster R-CNN代碼例子

主要參考文章&#xff1a;1&#xff0c;從編程實現角度學習Faster R-CNN&#xff08;附極簡實現&#xff09; 經常是做到一半發現收斂情況不理想&#xff0c;然后又回去看看這篇文章的細節。 另外兩篇&#xff1a; 2&#xff0c;Faster R-CNN學習總結 這個主要是解釋了18,…

剝開比原看代碼09:通過dashboard創建密鑰時,前端的數據是如何傳到后端的?

2019獨角獸企業重金招聘Python工程師標準>>> 作者&#xff1a;freewind 比原項目倉庫&#xff1a; Github地址&#xff1a;https://github.com/Bytom/bytom Gitee地址&#xff1a;https://gitee.com/BytomBlockchain/bytom 在前面一篇文章&#xff0c;我們粗略的研究…

面試題 17.24. 最大子矩陣

面試題 17.24. 最大子矩陣 給定一個正整數、負整數和 0 組成的 N M 矩陣&#xff0c;編寫代碼找出元素總和最大的子矩陣。 返回一個數組 [r1, c1, r2, c2]&#xff0c;其中 r1, c1 分別代表子矩陣左上角的行號和列號&#xff0c;r2, c2 分別代表右下角的行號和列號。若有多個…

js模擬form表單提交數據, js模擬a標簽點擊跳轉,避開使用window.open引起來的瀏覽器阻止問題...

js模擬form表單提交數據, js模擬a標簽點擊跳轉&#xff0c;避開使用window.open引起來的瀏覽器阻止問題 js模擬form表單提交數據源碼&#xff1a; /** * js模擬form表單提交 * param {object} 參數對象 * url 必填 提交地址 * methond 選填 默認post 提交方…

004. ES6之函數的擴展

2019獨角獸企業重金招聘Python工程師標準>>> 1. 函數參數的默認值 ES6 允許為函數的參數設置默認值&#xff0c; function log(x, y World) {console.log(x, y); }log(Hello) // Hello World log(Hello, China) // Hello China log(Hello, ) // Hello// 1. 參數變量…

數據結構 | 鏈表:1097 刪除重復元素

代碼提交之后一直說段錯誤。我以為是數組開的不夠大&#xff0c;但是隨著數組一點一點開大&#xff0c;還是有一個case沒有AC。最終我發現&#xff1a;是有個邊界條件沒有考慮到 void printList(const vector<Node>& a){if(!a.size()) return;FF(i,a.size()-1){print…

算法之美 : 位運算

上一小節我們用三道題了解一下面試過程中棧和隊列的常見面試題。本小節筆者將通過幾個 位運算 的題目來帶大家熟悉下常用的位運算知識。 相比于棧和隊列來講&#xff0c;筆者自身認為位運算需要掌握的知識就要多一些&#xff0c;包括對于數字的二進制表示&#xff0c;二進制的反…

447. 回旋鏢的數量

447. 回旋鏢的數量 給定平面上 n 對 互不相同 的點 points &#xff0c;其中 points[i] [xi, yi] 。回旋鏢 是由點 (i, j, k) 表示的元組 &#xff0c;其中 i 和 j 之間的距離和 i 和 k 之間的距離相等&#xff08;需要考慮元組的順序&#xff09;。 返回平面上所有回旋鏢的…

一名3年工作經驗的程序員應該具備的技能

本文轉自:https://m.imooc.com/article/details?article_id7557 前言 因為和同事有約定再加上LZ自己也喜歡做完一件事之后進行總結&#xff0c;因此有了這篇文章。這篇文章大部分內容都是面向整個程序員群體的&#xff0c;當然因為LZ本身是做Java開發的&#xff0c;因此有一部…

js 排序算法總結

1.冒泡排序 平均時間復雜度O(N2) 最好情況O(N)最壞情況O(N2) 空間復雜度O(1) function bubbleSort(arr){if(arr.length < 1)return arr;var flag 1; // 標識是否進行交換for(var i0; i < arr.length; i){if(i !0 && flag) break;for(var j0; j <…

524. 通過刪除字母匹配到字典里最長單詞

524. 通過刪除字母匹配到字典里最長單詞 給你一個字符串 s 和一個字符串數組 dictionary 作為字典&#xff0c;找出并返回字典中最長的字符串&#xff0c;該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個&#xff0c;返回長度最長且字典序最小的字符串。如果答案…

django開發商城(提供初始數據,商城首頁及購物車)

1.爬取數據 2.json數據轉化為sql語句 3.新建輪播圖模型(模型名與sql語句對應表名相同) class Wheel(models.Model):imgmodels.CharField(max_length150)namemodels.CharField(max_length20)trackidmodels.CharField(max_length20) 4.終端打開mysql,執行插入語句 5.在首頁進行展…

多語言版希爾排序

2019獨角獸企業重金招聘Python工程師標準>>> 簡介 希爾排序(Shells Sort)是插入排序的一種又稱“縮小增量排序”&#xff08;Diminishing Increment Sort&#xff09;&#xff0c;是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L…

UML 中extend和include的區別

在UML用例圖中有兩種關系——包含和擴展&#xff0c;容易混淆&#xff0c;下面通過一張表來區別一下這兩種關系。 轉載于:https://www.cnblogs.com/yonyong/p/8555547.html

hdu 6301 Distinct Values(貪心)題解

題意&#xff1a;長為n的串&#xff0c;給你m個區間&#xff0c;這些區間內元素不重復&#xff0c;問這樣的串字典序最小為&#xff1f; 思路&#xff1a;用set保存當前能插入的元素&#xff0c;這樣就能直接插入最小元素了。對操作按l排序&#xff0c;因為排過的不用排&#x…