大家一起学爬虫(二)

1。查找同级子节点

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html,"lxml")
# 查找同级子节点
for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings:
    print(sibling)

next_siblings可以查找所有同级节点,其它类似的方法还有next_sibling(只找下一个同级节点),previous_sibling(只找前一个同级节点),previous_siblings(找该节点前的所有同级节点)
parent查找父节点,parents查找所有父节点

2。使用正则表达式过滤数据

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re


html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html,"lxml")
# 使用正则表达式匹配图片名
# 图片格式为:../img/gifts/img*.jpg
images = bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")})
for image in images:
    print(image["src"])
print(bsObj.img.attrs)
正则表达式可以只保留需要的图片文件名。


3。使用lambda过滤数据

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html,"lxml")
# 使用lambda查找只有两个属性tag,有一个问题是tag的子节点也会保留,可以继续过滤
print(bsObj.findAll(lambda tag:len(tag.attrs)==2))

4。开始动真格的,从维基百科上爬取链接

from urllib.request import urlopen
from bs4 import BeautifulSoup


html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bsObj = BeautifulSoup(html,"lxml")
for link in bsObj.findAll("a"):
    if "href" in link.attrs:
        print(link.attrs["href"])

5。爬取数据前一定要分析html源码,方便过滤掉不相关的信息,后续处理会少很多工作量。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bsObj = BeautifulSoup(html,"lxml")
for link in bsObj.find("div", {"id":"bodyContent"}).findAll("a", {"href":re.compile("^(/wiki/)((?!:).)*$")}):
    print(link.attrs["href"])

看了两天书,觉得应该可以爬各种网站了,结果使用urlopen经常出现 bad getway,也就是用了反爬虫手法,信心很受打击。

后面的内容应该会包含如何加代理和消息头来欺骗服务器。

扫描二维码关注公众号,回复: 2659143 查看本文章

继续努力!不急不躁!


猜你喜欢

转载自blog.csdn.net/eagle1024/article/details/78045694
今日推荐