crawler 聽課筆記 碎碎念 1 初步瞭解各類選擇器極其簡單的使用

css中css

身份證  id對應#html

衣服      class對應 . node

 

圖片python

pyquery。。。as pqweb

html= request.get(url=''.....'')正則表達式

doc=pq(html)數據庫

doc("#dq_list > li").items()          tems()拿到全部子元素json

for item in items:windows

    url= item.find('img').attr("lz_src")數組

    url_content= requests.get(url= url).content

   name= item.find('.kp-name').text()

 

 with open("./xxxxx")+name+".jpg","wb")as f:

      file.write(url_content)

 

馬賽克合成工具foto

 

 

 

 

css選擇器

1.元素選擇器    直接選擇文檔元素,如head p 這些

2.類選擇器     對<h1 class="important">,類名就是important  .important就是選擇全部這個類屬性的元素     可結合元素選擇器,好比p.important

3.id選擇器     對<h1 id="intro">  id就是important  #intro就是選擇id=intro的元素     可結合元素選擇器,好比p.#intro

           類選擇器能夠全局共享,可是i同一d一個文檔只能出現一次,是全局惟一的,不能使用單詞列表

           與類選擇器同樣都區分大小寫

4.屬性選擇器    選擇有某一個屬性的元素,而不論值是什麼  *[title]選擇全部包含title的元素   a[herf]選擇全部帶有href屬性的錨元素

          能夠選擇多個元素a[herf][title]這裏是and屬性,要同時知足  

          限定值a[href="www.baidu.com"]

5.後代選擇器    選擇某一個元素後代的元素(在層級上面沒有限制)      h1 em

6.子元素選擇器    範圍限制在子元素                    h1 > strong

 

Xpath

基本節點:元素、屬性文本、命名空間、處理指令、註釋以及根節點

節點之間的關係:父  子 兄弟 先輩  後代

nodename選取此節點的全部子節點

/從根節點選取

//從匹配的當前的節點選擇文檔中的節點,不考慮它們的位置

.選取當前節點

..選取當前節點的父節點

@選取屬性

 

Xpath的謂語很強大,寫在[]裏面

/bookstore/book[1]選第一個book元素

/bookstore/book[last()]最後一個book元素

/bookstore/book[position()<3]選前兩個

//title[@lang]選擇的全部有名字爲lang的屬性的title屬性

/bookstore/book[price>35.00]

 

Json 讓xml簡單化

import jason

obj = {'one':1,'two':2,'three':[1,2,3]}

encoded= jason.dumps(obj)               變成str

decoded= json.loads(encoded)          變成dict

 

 xml處理

1.DOM方法 整個讀取  量小的話還行,可是性能其實很慢

from xml.dom import minidom

doc = minidom.parse('book.xml')
root = doc.documentElement

print(root.nodeName)
books = root.getElementsByTagName('book')
for book in books:
    titles = book.getElementsByTagName('book')   #這裏拿到的是一個數組
    title = titles[0].childNodes[0].nodeValue
    print(title)

2.SAX流模式 邊讀邊解析  層級關係必須本身弄 在數據庫中用的比較多吧

import string
from xml.parsers.expat import ParserCreate

class DefaultSaxHandler:
    def start_element(self,name,attrs):
        self.name = name
        print('elements:%s, attrs: %s'%(name,str(attrs)))
    def end_element(self,name):
        print('end elements:%s')%name)
    def end_element(self,name):
        if text.strip()
            print("%S's text is %s")%(self.name,text))

handler = DefaultSaxHandler()
parser= ParserCreate()
parser.StartElementHandler = handler.start_element  #<book>
parser.EndElementHandler = handler.end_element  #</book>
parser.CharacterDataHandler = handler.char_data #<title>character</title>
with open('book.xml','r') as f:
  parser.Parser(f.read())

 

 

正則表達式

基本匹配規則 很少複述

一些規則:

*匹配前面的字符或者表達式0詞或者屢次

+匹配前一個字符至少一次

?匹配前一個字符至少0次或者1次

^匹配字符串開頭

$匹配字符串結束

import re


mr= re.match(r'\d{3}-\d{3,8}','010-223456')
print(mr.string)

m = re.match(r'(\d{3}-\d{3,8})$','010-223456')
print(mr.groups())
print(mr.group(0))    #原始字符串

t ='20:15:45'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$',t)

print(m.groups())
#分割字符串
p= re.complie(r'\d+')    #先寫好匹配的路徑,生成python對象
print(p.split('one1two22three333'))

 

 

 selenium簡單爬蟲使用

主要是運用如下的兩個代碼來爬取數據,其餘的相關基本設置就看一下下面的案例

find_element(s)_by_tag_name 

find_element(s)_by_css_selector

improt time
from selenium import webdriver

browser = webdriver.Chrome()
browser.set_page_load_timeout(30)    

browser.get('xxxxxxxxxxxxxxxxx')
page_info = browser.find_element_by_csss_selector('這裏貼谷歌網頁中的css路徑')
#目標信息假設是  共48頁,每頁24條
pages = int((page_info.text.split(', ')[0]).split(' ')[1]) #這樣就取到了48這個數字
print('商品一共有%d頁'%pages)
for i in range(pages):
    if i >2:
        break
    url = ' xxxxxxxxxxxxx'+str(i+1)
    browser.get(url)
    browser.execute_script("windows.scrollTo(0,document.body.scrollHeight);")
   time.sleep(2
)
  goods = browser.find_element_by_css_selector("xxxx主標籤xxxx").find_elements_by_tag_name('li')
  print('第%d頁有%d件商品'%((i+1),len(goods))
  for good in goods:
      try:
        title = good.find_element_by_css_selector('.....').text
        price = good.find_element_by_css_selector('.....').text
        print(title,price)
      except:
        print('ERROR')

 可是咱們也會發現,每一次爬取的時候都會跳出自動運行的瀏覽器

這實際上是能夠避免的,詳細的能夠參考個人學習筆記

http://www.javashuo.com/article/p-khevbnax-eq.html

相關文章
相關標籤/搜索