BeautifulSoup初体验
来源:互联网 发布:李明老师的linux视频 编辑:程序博客网 时间:2024/06/05 03:50
欲学爬虫,scrapy是python的重点,scrapy是框架,核心还是解析html元素,这方面专业的还是BeautifulSoup。
这是官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id9
多看官方文档,多练习,基本上可以掌握的很清晰!
1 配置
1,1配置模拟浏览器
from bs4 import BeautifulSoupimport requestsurl='http://example.com/'header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20100101 Firefox/36.0'}Gecko/20100101 Firefox/36.0'}response = requests.get(url, headers=header)html=response.textsoup=BeautifulSoup(html,'lxml')#这里可以指定解析器类型 lxml,html.parserprint soup.p
各个解析器的特点
beautifulsoup负责获取对象,或者对象的集合,剩下来比较重要的就是迭代集合和输出结果
2 bs解析原理
soup=BeautifulSoup(html,’lxml’)
soup.a —-< ‘a href=”http://www.iana.org/domains/example”>More information…<’/’a>
soup.a.attrs ——{‘href’: ‘http://www.iana.org/domains/example‘}
soup.a.text ———-More information…
soup.a[‘href’] ——-http://www.iana.org/domains/example
soup.a.prettify() —–格式化输出
< a href=”http://www.iana.org/domains/example”>
More information…
<’/’a>
正则解析
导入re模块
for str in soup.find_all(‘img’,{“src”:re.compile(“http:\/\/mm.*.jpg”)}):
print str
3 实际案例
3.1 从妹子图这个网站上抓图片
from bs4 import BeautifulSoupfrom urllib import urlopenimport reimport requestsurl='http://www.meizitu.com/'header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20100101 Firefox/36.0'} Gecko/20100101 Firefox/36.0'}response = requests.get(url, headers=header)html=response.textsoup=BeautifulSoup(html,'lxml')imgs= soup.find_all('img',{"src":re.compile("http:\/\/mm.*.jpg")}) #正则匹配链接地址for i,img in enumerate(imgs): try: html=urlopen(img['src']) data=html.read() fileName="{}/{}.jpg".format('e:/photo/',i+1) #批量命名文件 print ("loading",fileName ) with open(fileName,'wb') as f: f.write(data) except Exception: print ("地址错误")
以上主要是beautifulsoup对tag的解析,获取url以后,重点是文件的写入
3.2 从淘宝女郎上面抓mm的信息和图片
import osimport threadingimport refrom bs4 import BeautifulSoupfrom urllib import urlopenfrom selenium import webdriverbrowserPath = 'phantomjs-1.9.2-windows/phantomjs.exe'homePage = 'https://mm.taobao.com/search_tstar_model.htm?'outputDir = 'e:/photo/'parser = 'lxml'def main(): driver = webdriver.PhantomJS(executable_path=browserPath) #浏览器的地址 driver.get(homePage) #访问目标网页地址 bsObj = BeautifulSoup(driver.page_source, parser) #解析目标网页的 Html 源码 print("[*]OK GET Page") driver=webdriver.Firefox() print 'a' driver.implicitly_wait(10) print 'b' girlsList = driver.find_element_by_id('J_GirlsList').click() #获得主页上所有妹子的姓名、所在城市、身高、体重等信息 .text.split('\n') imagesUrl = re.findall('\/\/gtd\.alicdn\.com\/sns_logo.*\.jpg', driver.page_source) #获取所有妹子的封面图片 girlsUrl = bsObj.find_all( "a", {"href": re.compile("\/\/.*\.htm\?(userId=)\d*")}) #解析出妹子的个人主页地址等信息 girlsNL = girlsList[::3] # 所有妹子的身高体重 girlsHW = girlsList[1::3] # 所有妹子的个人主页地址 girlsHURL = [('http:' + i['href']) for i in girlsUrl] # 所有妹子的封面图片地址 girlsPhotoURL = [('https:' + i) for i in imagesUrl] girlsInfo = zip(girlsNL, girlsHW, girlsHURL, girlsPhotoURL) # 姓名地址 girlNL, 身高体重 girlHW # 个人主页地址 girlHRUL, 封面图片 URL for girlNL, girlHW, girlHURL, girlCover in girlsInfo: print("[*]Girl :", girlNL, girlHW) # 为妹子建立文件夹 mkdir(outputDir + girlNL) print(" [*]saving...") # 获取妹子封面图片 data = urlopen(girlCover).read() with open(outputDir + girlNL + '/cover.jpg', 'wb') as f: f.write(data) print(" [+]Loading Cover... ") # 获取妹子个人主页中的图片 getImgs(girlHURL, outputDir + girlNL) driver.close()def mkdir(path): # 判断路径是否存在 isExists = os.path.exists(path) # 判断结果 if not isExists: # 如果不存在则创建目录 print(" [*]新建了文件夹", path) # 创建目录操作函数 os.makedirs(path) else: # 如果目录存在则不创建,并提示目录已存在 print(' [+]文件夹', path, '已创建')def getImgs(url, path): driver = webdriver.PhantomJS(executable_path=browserPath) driver.get(url) print(" [*]Opening...") bsObj = BeautifulSoup(driver.page_source, parser) #获得模特个人页面上的艺术照地址 imgs = bsObj.find_all("img", {"src": re.compile(".*\.jpg")}) for i, img in enumerate(imgs[1:]): #不包含与封面图片一样的头像 try: html = urlopen('https:' + img['src']) data = html.read() fileName = "{}/{}.jpg".format(path, i + 1) print(" [+]Loading...", fileName) with open(fileName, 'wb') as f: f.write(data) except Exception: print(" [!]Address Error!") driver.close()if __name__ == '__main__': if not os.path.exists(outputDir): os.makedirs(outputDir) main()
重点是selenium 的webdriver,是一个强大的网络数据采集工具,最初是为网站自动化测试而开发的。近几年,他还被广泛用于获取精确的网站快照,因为他们可以直接运行在浏览器上。Selenium 可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作上是否发生。但是selenium需要指定浏览器,还要安装对应的核心驱动,配置起来比较麻烦。博主尝试了很多次,还是一直can`t find element ,主要问题就是webdriver的配置有问题。
driver.implicitly_wait(10) 以及在firfox安装文件下面安装geckodriver.exe 是常用的解决方案
- BeautifulSoup初体验
- Python3.6 爬虫初体验--urllib、beautifulsoup(一)
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- beautifulsoup
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- beautifulsoup
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- BeautifulSoup
- Beautifulsoup
- beautifulsoup
- ASM ClassReader failed to parse class file的问题解决过程
- Django+Mysql性能优化小记
- 百度api实现框选,显示框选区域内的数据,并且点击数据点显示详细信息
- 数据库 case when then else end 操作
- 欢迎使用CSDN-markdown编辑器dfas
- BeautifulSoup初体验
- webpack使用过程中遇到的错误
- 百万级数据Like查询优化方案
- python list range 字符串的截取 如 text[1:5]
- 阿里云的linux系统下安装JDK以及tomcat
- 社会网络中社团发现及网络演化分析
- datetime日期数据的生成
- Daemon线程 finally
- HDU-1864 最大报销额