想優化一下剛剛寫的爬蟲,改一下Selectors 去看文檔 眼花繚亂 ,所以想在這裏總結一下Selectors 的簡單用法, 不扯別的,就是學會用 ,
簡單粗暴的學會用法 我們不如還拿拉勾網實驗可好 滑稽.jpg https://www.lagou.com/zhaopin/Java/
看到了網頁的源代碼,我們想從這個裏面取到需要的數據,就用到了選擇器
相信用到Selectors的小夥伴們都已經建好scrapy項目了,所以我不做贅述 只需要在spiders文件夾下面新建一個forth.py文件內容如下:
import scrapy
from First.items import FirstItem
class Lagou(scrapy.Spider):
name = "forth"
start_urls = [
"https://www.lagou.com/zhaopin/Java/"
]
def parse(self , response):
pass
這篇文章會講解到的css選擇器有
#container 選擇id為container的元素.container 選擇所有class包含container的元素* 選擇所有元素div a 選取所有div下所有a元素ul + p 選取ul後面的第一個p元素ul ~p 選取與ul相鄰的所有p元素a:nth-child(2) 選取下面第二個標簽,如果是a的話則選取,不是則不取a:nth-child(2n) 選取第偶數個a元素a:nth-child(2n+1) 選取第奇數個a元素li.multi-chosen > a 選取class為multi-chosen的li的所有a元素a[title] 選取所有擁有title屬性的a元素a[href=”https://www.lagou.com/jobs/3537439.html”] 選取所有href屬性為https://www.lagou.com/jobs/3537439.html的a元素a[href*=”www.lagou.com”] 選取所有href屬性值中包含www.lagou.com的a元素a[href^=”http”] 選取所有href屬性值中以http開頭的a元素div:not(#content-container) 選取所有id為非content-container 的div開始測試css選擇器
- #container 選擇id為container的元素
- .container 選擇所有class包含container的元素
- * 選擇所有元素
可以看到所有的信息都在class = .con_list_item 的li標簽之中
def parse(self , response):
for item in response.css('.con_list_item *'):
jobMessage = item.css('::text').extract()
print(jobMessage)
修改parse方法中的選擇器 , 使用 .con_list_item * 來找到class為con_list_item 下的所有節點 用jobMessage來接收 ::text 是取出標簽中的內容 為了提取真實的原文數據,需要調用 .extract() 方法 運行名為forth的爬蟲~
scrapy crawl forth
拿到數據了~ 雖然很亂但是拿到了對吧~ 說明我們的selectors成功了
看! 這個h3正合我們的胃口 修改parse方法
def parse(self , response):
for item in response.css('.con_list_item h3'):
jobMessage = item.css('::text').extract()
print(jobMessage)
獲取到了所有的h3
基礎知識大家已經知道了 所以直接上代碼
def parse(self , response):
for item in response.css('#lg_tnav h1'):
jobMessage = item.css('::text').extract()
print(jobMessage)
接著學習別的
只需要修改為
for item in response.css('div a'):
工作地點是一個span標簽 它後面的內容有一大堆,假如我們只想取第一個 那麼就是一個a標簽 先取出“工作地點”
def parse(self , response):
for item in response.css('.title'):
jobMessage = item.css('::text').extract()
print(jobMessage)
接著取出它後面a標簽 只需改動一處
for item in response.css('.title + a'):
我們甚至還可以用上面的例子 改動一處
for item in response.css('.title ~ a'):
- a:nth-child(2) 選取下面第二個標簽,如果是a的話則選取,不是則不取
修改代碼如下
def parse(self , response):
for item in response.css('.multi-chosen'):
jobMessage = item.css('a:nth-child(2)::text').extract()
print(jobMessage)
如果我們修改一行代碼,取第一個a標簽
jobMessage = item.css('a:nth-child(1)::text').extract()
取出的數據為空,為什麼呢? 因為第一個標簽不是a標簽,而是span標簽,所以不取。 再次修改為以下語句,取出第一個span標簽
jobMessage = item.css('span:nth-child(1)::text').extract()
由此可得,需要同時匹配標簽和位置才可以取出元素
- a:nth-child(2n) 選取第偶數個a元素
我們叒使用之前的例子,只需要修改一句
jobMessage = item.css('a:nth-child(2n)::text').extract()
成功的取出第偶數個a元素 那麼類比可得
- a:nth-child(2n+1) 選取第奇數個a元素 測試一下
jobMessage = item.css('a:nth-child(2n+1)::text').extract()
成功的取出的第奇數個a元素中的內容 為什麼沒有取出第一條內容“工作經驗” 呢? 當然是因為它是span標簽中的內容,而不是a標簽中的內容 如果我們用
jobMessage = item.css('span:nth-child(2n+1)::text').extract()
就可以取出它了
- li.multi-chosen > a 選取class為multi-chosen的li的所有a元素
我們叕用上面的例子,修改代碼如下
def parse(self , response):
for item in response.css('li.multi-chosen > a'):
jobMessage = item.css('::text').extract()
print(jobMessage)
- a[title] 選取所有擁有title屬性的a元素
修改代碼如下
def parse(self , response):
for item in response.css('a[data-lg-tj-no]'):
jobMessage = item.css('::text').extract()
print(jobMessage)
- a[href=”https://www.lagou.com/jobs/3537439.html”] 選取所有href屬性為https://www.lagou.com/jobs/3537439.html的a元素
要取出href=”https://www.lagou.com/jobs/3537439.html”的a標簽 下 h3標簽中的內容 代碼如下
for item in response.css('a[href="https://www.lagou.com/jobs/3537439.html"] h3'):
jobMessage = item.css('::text').extract()
- a[href*=”www.lagou.com”] 選取所有href屬性值中包含www.lagou.com的a元素
修改代碼
for item in response.css('a[href*="www.lagou.com"] h3'):
- a[href^=”http”] 選取所有href屬性值中以http開頭的a元素
修改代碼
for item in response.css('a[href^="http"]'):
jobMessage = item.css('::text').extract()
- div:not(#content-container) 選取所有id為非content-container 的div
頁面的結構分上下兩部分,頭部的id 為lg_header , 下部的id為content-container 為了選取上部分,我們有兩種方法 1.#lg_header 或者 div:not(#content-container)
修改代碼如下
for item in response.css('div:not(#content-container) h1'):
jobMessage = item.css('::text').extract()
大概就是這麼多了,這篇文章主要是寫了css選擇器的使用。 有時候css , xpath選擇器組合使用,可以簡單的獲取到數據。有時間的話我會再寫一篇xpath選擇器的用法