python几种遍历复杂网站的方法原理是什么

Python019

python几种遍历复杂网站的方法原理是什么,第1张

python网络爬虫原理

互联网网页可以看成是一张超大图,每个网页是一个节点,网页中指向其他网页的链接是边。那么,可以这样实现全网网页收集:以某一个网页为起点,下载并处理该网页,解析里面的链接,所得的URL加入下载队列。这个过程其实就是图的遍历过程,可以是深度优先或者广度优先遍历,取决于下载队列如何维护。简单地,网络爬虫可以由以下部分组成: 1、下载模块

获取标签内容

使用element.attribute()方法获取dom元素的内容,如:

dr = driver.find_element_by_id('tooltip')

dr.get_attribute('data-original-title') #获取tooltip的内容

dr.text #获取该链接的text

获取标签属性

link=dr.find_element_by_id('tooltip')

link.value_of_css_property('color') #获取tooltip的CSS属性color的属性值

link.find_element_by_tag_name('h3').value_of_css_property('font') #获取h3的CSS属性font的属性值

获取标签状态

是否显示:使用element.is_displayed()方法

是否存在:使用find_element_by_xxx()方法,捕获其抛出的异常, 如果存在异常的话则可以确定该元素不存在

text_field=dr.find_element_by_name('user').is_enabled()

#直接用element.is_enabled()方法判断button,返回值为true,因为button是使用CSS方法判断是否有效这并不是真正的方法,需要判断其class中是否有值为disabled来判断是否真正处于disabled的状态

dr.find_element_by_class_name('btn').is_enabled()

是否被选中:一般判断表单元素,如radio或checkbox是否被选中,使用element.is_selected()方法

radio.is_selected() #判断是否被选中

try:

dr.find_element_by_id('none')

except:

print 'element does not exist'

是否有效:即是否为灰化状态,使用element.is_enabled()状态

print text_field.is_displayed() #判断是否显示

"""

@author: wangxingchun

多线程(线程池)

下载数据

"""

import requests

import csv

from concurrent.futures import ThreadPoolExecutor as tp

#创建一个csv文件,注意创建writer对象"csv.writer()"

f = open('xinfadi.csv','w',encoding='utf8')

csvwrite = csv.writer(f)

#如果写入txt文件,不需要创建writer对象。

# f = open('xinfadidata.txt','w',encoding='utf8')

#创建一个函数,以页码做为参数

def down(n_page):

url = 'http://www.xinfadi.com.cn/getPriceData.html'

data = {'count': 428225,'current': n_page,'limit': 20}

resp = requests.post(url,data=data)

datas =resp.json()

#通过分析数据嵌套情况,获取数据。此处可在网页开发工具json数据中查看分析。

for i in range(len(datas['list'])):

name = datas['list'][i]['prodName']

highPrice = datas['list'][i]['highPrice']

lowPrice = datas['list'][i]['lowPrice']

pubDate = datas['list'][i]['pubDate']

place = datas['list'][i]['place']

csvwrite.writerow((name,highPrice,lowPrice,pubDate,place))#writerow要求写入的是可迭代对象

# f.writelines(f'{name},{highPrice},{lowPrice},{pubDate},{place} ')

resp.close()

if __name__ == '__main__':

with tp(50) as t: #创建线程池,

for n in range(1,101): #遍历数据网页

t.submit(down,n) #提交给线程池,进行多线程下载

print(f'共{n}页数据下载完毕!')

f.close()