利用selenium+PhantomJs/Chrome爬取医疗网站医院信息学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012535605/article/details/81487661

      今天学习爬取一个医疗网站的医院数据,html页面有属性和标签,返回的请求也有属性和标签,但是用BS\re等均匹配不到数据,简直是无语了,后来通过查找资料发现页面被JS渲染了,利用普通的规则是无法获取数据的,但phantomjs很好的解决了这个问题。

      PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。简而言之:基于WebKit的,没有界面的浏览器。闪亮的功能点:PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试。优势:跨平台,易上手。(将一个页面输入给Phantomjs,其就如同一个浏览器一样,去解析执行这个页面,获取最终展示的结果)

     听说PhantomJS团队已经停止更新,但我们可用Chrome直接模拟浏览器登录,效果一样的好呢,但需要自己装Chrome的驱动,手动配置均能完成需求。

selenium定位元素函数:

前八种是大家都熟悉的,经常会用到的,
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)

这八种是复数形式
9.id复数定位find_elements_by_id(self, id_)
10.name复数定位find_elements_by_name(self, name)
11.class复数定位find_elements_by_class_name(self, name)
12.tag复数定位find_elements_by_tag_name(self, name)
13.link复数定位find_elements_by_link_text(self, text)
14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
15.xpath复数定位find_elements_by_xpath(self, xpath)
16.css复数定位find_elements_by_css_selector(self, css_selector)

具体事例如下

from urllib import request
from bs4 import BeautifulSoup
import bs4
import re
import pandas as pd
#抓取医院的URL
start_url = "XXXXX"
#设置headers
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
page = request.Request(start_url, headers=headers)
page_info = request.urlopen(page).read()
#page_info = page_info.decode('utf-8')

from lxml import etree
html = etree.HTML(page_info)
#存储所有的URL列表
all_url=html.xpath('//div[@class="XXX"]/ul/li/a/@href')

#求医院数量
len(all_url)

#遍历所有链接下医院信息数据
all_list=[]
test_list=[]

#利用selenium模拟网站登录
from selenium import webdriver
browser = webdriver.PhantomJS()#可以换成Chrome
#医院链接转化
for i in all_url:
    test_list.append('https://m.'+str(re.sub('//', '', i, count=0, flags=0)))
for i in test_list:
    browser.get(i)
    phone = browser.find_elements_by_xpath('//div[@class="XXX"]')[0].text
    name = browser.find_elements_by_xpath('//div[@class="XXX"]/h2')[0].text
    h_class = browser.find_elements_by_xpath('//div[@class="XXX"]/p/span')[0].text
    h_add = browser.find_elements_by_xpath('//div[@class="XXX"]/a')[0].text
    all_list.append([phone,name,h_class,h_add])

#转化成DF格式
test=pd.DataFrame(all_list)
test.columns=['phone','name','class','address']

猜你喜欢

转载自blog.csdn.net/u012535605/article/details/81487661
今日推荐