爬虫入门一
为什么不直接使用属性设置元素?
核心思想和函数有些类似,通过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