网络爬虫学习笔记2

CSS

  • css = Cascading Style Sheets
  • 样式定义如何显示HTML元素
  • 选择器: eg: h1{color: red; font-size: 14px}
    • 元素选择器: 直接选择文档元素。
    • 类选择器:
      1. 元素的class属性,eg: < h1 class=”important”>
      2. .important选择所有有这个类属性的元素
      3. 结合元素选择器,比如p.important
    • id选择器
    • 属性选择器

XPath

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

谓语:

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

json

json = JavaScript Object Notation
类似XML, 但是比XML更小、更快,更易解析。
json解码后是一个字典

import json
obj = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
encoded = json.dumps(obj)
print(type(encoded))
print(encoded)
decoded = json.loads(encoded)
print(type(decoded))
print(decoded)

python处理XML方法

  • DOM把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历数的节点。
  • SAX流模式, 边读边解析,占用内存小,解析快,缺点是需要自己处理事件。
<?xml version="1.0"?>
<bookstore>
    <book>
        <title>Learn Python</title>
        <price>100</price>
    </book>
    <book>
        <title>Learn XML</title>
        <price>80</price>
    </book>
<\bookstore>
from xml.dom import minidom

doc = minidom.parse('book.xml')
root = doc.documentElement
print(type(root))
print(root.nodeName)
books = root.getElementsByTagName('book')
for book in books:
    titles = book.getElementsByTagName('title')
    prices = book.getElementsByTagName('price')
    title = titles[0].childNodes[0].nodeValue
    price = prices[0].childNodes[0].nodeValue
    print(title, price)
import string
from xml.parsers.expat import ParseCreate
class DefaultSaxHandler:
    def start_element(selt, name, attrs):
        self.name = name
        print('element: %s, attrs: %s' %(name, str(attrs))
    def end_element(self, name):
        print('end element: %s' %name)
    def char_data(self, text):
        if text.strip():
            print("%s's text is %s" %(self.name, text))
handler = DefaultSaxHandler()
parse = ParserCreate()
parse.StartElementHandler = handler.start_element #<book>
parser.EndElementHandler = handler.end_element
parser.CharacterHandler = handler.char_data
with open('book.xml', 'r') as f:
    parser.Parse(f.read())

正则表达式

基本匹配规则

  • [0-9]任意一个数字,等价\d
  • [a-z]任意一个小写字母
  • [A-Z]任意一个大写字母
  • [\^0-9]匹配非数字,等价\D
  • \w 等价[a-z0-9_],字母数字下划线
  • \W等价对\w取非
  • . 任意字符
  • []匹配内部任意字符或子表达式
  • [\^]对字符集合取非
  • *匹配前面的字符或者子表达式0次或多次
  • +匹配前一个字符至少一次
  • ?匹配前一个字符0次或1次
  • ^匹配字符串开头
  • $匹配字符串结束
import re
#匹配3位数字-3到8个数字  \d{3}-\d{3,8}
mr = re.match(r'\d{3}-\d{3,8}', '010-223456')
print(mr.string)

#分组
m = re.match(r'(\d{3})-(\d{3,8})$', '010-12345')#'r'表示后面的是正则表达式,不对‘\’做转义字符处理
print(m.groups())#匹配结果
print(m.group(0))#原始字符串
print(m.group(1))#第一个分组
print(m.group(2))#第二个分组

#匹配时间
t = '20:15:45'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-9]\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9])', t)
print(m.groups())

#分割字符串
p = re.compile(r'\d+')
print(p.split('one1two22three333'))

Selenium简介和实战

关键命令

  • find_elements(s)_by_tag_name
  • find_elements(s)_by_css_selector

环境配置

pip install selenium
谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
注意要下载和浏览器版本一致的驱动。

电商网站数据爬取

from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.set_page_load_timeout(30)
browser.get('http://www.17huo.com/search.html?sq=2&keyword=%E7%BE%8A%E6%AF%9B')
page_info = browser.find_element_by_css_selector('body > div.wrap > div.pagem.product_list_pager > div')
# print(page_info.text)
pages = int((page_info.text.split(',')[0]).split(' ')[1])
for page in range(pages):
    if page > 2:
        break
    url = 'http://www.17huo.com/?mod=search&sq=2&keyword=%E7%BE%8A%E6%AF%9B&page=' + str(page + 1)
    browser.get(url)
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)   # 不然会load不完整
    goods = browser.find_element_by_css_selector('body > div.wrap > div:nth-child(2) > div.p_main > ul').find_elements_by_tag_name('li')
    print('%d页有%d件商品' % ((page + 1), len(goods)))
    for good in goods:
        try:
            title = good.find_element_by_css_selector('a:nth-child(1) > p:nth-child(2)').text
            price = good.find_element_by_css_selector('div > a > span').text
            print(title, price)
        except:
            print(good.text)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值