《用python写网络爬虫》笔记2

1.Beautiful Soup

能够正确解析缺失的引号并闭合标签,此外还添加 了 <html>和 <body>标签使其成为完整的HTML 文档

Soup = BeautifulSoup(html)
tr = soup.find(attrs={‘id’:‘place area row’})
#形式选择和attrs的参数匹配的标签
td=tr.find_all(attrs={…})
#进一步选择匹配的标签
Area = Td.text
#输出选中的标签的文字内容

这段代码虽然 比正则表达式的代码更加复杂, 但更容易构造和理解。 而且,像多余的空格和标签属性这种布局上的小变化, 我们也无须再担心了

2.lxml

模块使用 C语言编写 , 解析速度 比 Beautiful Soup 更快
使用 css 选择器


tree = lxml.html.fromstring(html)得到页面
d = tree.cssselect('tr#places_area_row > td.w2p_fw') [0]
area = td.text_content()
print area

tr#:id匹配的tr标签
“>”:父元素下的子标签
Td.:class匹配的td标签
css 选择器
css 选择器表示选择元素所使用 的模式。 下面是一些常用 的选择器示例 。
选择所有标签 :*
选择 <a> 标签 :a
选择所有 class=”link” 的 元 素 : .link
选择 class=”link” 的 <a> 标签 :a.link
选择 id=”home” 的 <a> 标签 :a#home
选择父元素为 <a> 标签的所有 <span> 子标签 :a > span
选择 <a> 标签 内部 的所有 <span> 标签 :a span
选择 title 属性为 ”Home” 的所有 <a> 标签 :a [title=Home ]

性能小结
如果你的爬虫瓶颈是下载网页, 而不是抽取数据的话, 那么使用较慢的方法 ( 如 Beautiful Soup) 也不成问题。 如果只需抓取少量数据 , 并且想要避免额外依赖的话, 那么正则表达式可能更加适合。 不过, 通常情况下, lxml 是抓取数据 的最好选择 , 这是 因 为 该方法既快速又健壮 , 而正则表达式和Beautiful Soup 只在某些特定场景下有用 。

3.回调函数和回调类

def link_crawler ( . . . , scrape_callback=None) :

scrape_callback就是一个回调函数。

link_crawler('http://example.webscraping.com/','/(index|view)',scrape_callback=ScrapeCallback())

用scrape_callback=ScrapeCallback()的方式改变要调用的函数

def __call__(self, url, html):

call是一个特殊方法, 在class对象作为函数被调用时会调用该方法, 这也是链接爬虫中cache callback 的调用方法。也就是说,调用普通函数ScrapeCallback (url, html)和调用类的函数 Scrape Callback.call(url, html) 是等价的,的调用形式上也是一致的

4.Csv写入表格

self.writer = csv.writer(open('countries.csv', 'w'))
#新建文件
self.writer.writerow(row)
#按行写入序列row[]的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值