爬虫我爱编程

爬虫入门一

2018-05-26  本文已影响9人  爱跑步的coder

为什么不直接使用属性设置元素?
核心思想和函数有些类似,通过id、class等标签达到快速批量修改的目的,而不需要逐个进行修改。

CSS选择器

1.元素选择器,如p head。

2.类选择器,如<h1 class = "important">,可使用.important选择类为important的所有元素。也可结合元素选择器,比如p.important。(泪点,使用的最多的选择器)

3.ID选择器(#来选择),ID是互不相同的。ID选择器可结合元素选择器。

4.属性选择器。如*[title]、a[href]、a[href][title]、a[href="www.baidu.com"]

5.后代选择器(子元素选择器是特殊的后代选择器,层级只能差1),主要表示的是层级关系。

XPath

XPath和CSS选择器相比的话,可以处理更加复杂的层级关系:不仅可以处理后代关系,而且可以处理同胞、先辈等关系。
XPath默认是从根节点开始操作的。

nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

import requests
from lxml import etree

content = requests.get(r'http://ip138.com/post/').content.decode('gb2312')
html = etree.HTML(content)
root = html.xpath(r'//*[@id="newAlexa"]/table//a')
for single in root:
    print single.get('href'), single.text #get表示获取某个属性

谓语

嵌在[]中用来查找某个特定节点或包含某个指定值得节点。
/datamap/data[1] 第一个book元素
/datamap/data[last()] 最后一个book元素
/datamap/data[position()<3] 选择前2个
//title[@lang] 选择所拥有有名为lang的属性的title元素
/datamap/data[price>35.00]

Json

Json = JavaScript Object Notation
类似XML,但是比 XML 更小、更快,更易解析。
参考例子sample.json
使用json库处理json,编码与解码。

encoded = json.dumps(dict) #对字典结构使用dumps
decoded = json.loads(encoded)

解析XML

DOM 把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
SAX 流模式,边读边解析,占用内存小,解析快,缺点是需要自己处理事件。

DOM和SAX的差别有些像是Py2中range和xrange的差别。

from xml.dom.minidom import parse

doc = parse("books.xml")
root = doc.documentElement //对应的是root
books = root.getElementsByTagName('book')
for book in books:
    titles = book.getElementsByTagName('title')
    print(titles[0].childNodes[0].nodeValue)
  

正则表达式入门

import re
m = re.match(r'(\d{3})-\d{3,8}$', '010-23128456')

print m.groups()
print m.group(0)  #匹配到的整个字符串

匹配时分秒

import re
s = "20:12:59"
m = re.match(r'^([0-1]?[0-9]|2[0-3]):([0-5]?[0-9]):([0-5]?[0-9])$', s)

分割字符串

p = re.compile('\d+') 
p.split('1234bbbbaaa22')

selenium

1.关键函数
find_elements_by_xpath
find_element(s)_by_tag_name
find_element(s)_by_css_selector
2.注意事项
1.要将chromedriver加入到系统变量(PATH)中。
2.在xpath中,class名称中间可能加空格。
3.find_elements_by_xpath得到list。

import time
from selenium import webdriver
import re

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

browser.get('http://www.17huo.com/newsearch/?k=%E5%A4%A7%E8%A1%A3')
page_info = browser.find_elements_by_xpath(r'/html/body/div[6]/div[2]/div[3]/div')
page_info = page_info[0].text

m = re.search(r'(\d+)', page_info)
page_number = (int)(m.groups()[0])

for i in range(page_number):
    if i>3:
        break
    
    
    url = r'http://www.17huo.com/newsearch/?k=%E5%A4%A7%E8%A1%A3&page=' + (str)(i)
    browser.get(url)
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)   # 不然会load不完整
    
    goods = browser.find_element_by_xpath(r'/html/body/div[6]/div[2]/div[2]').find_elements_by_xpath(r'.//div[@class="book-item-mid clearfix"]')
    print ("disp the {}th page,there are {} number of goods".format((i+1), len(goods)))
    
    for good in goods:
        try:
            price = good.find_element_by_xpath(r'.//span').text
            print price
            name = good.find_element_by_xpath(r'.//div[@class="book-item-title"]').text
            print name
            size = good.find_element_by_xpath(r'.//div[@class="book-item-flag"]').text
            print size
        except Exeception as e:
            print e
上一篇下一篇

猜你喜欢

热点阅读