写在前面的话: 总结一下学到的内容,还有在做项目中遇到的问题及其解决方式。都是为了学习巩固,有什么不对的地方还希望各位大佬指正出来,不胜感激。
一、在自己的类中加入线程
- 即类中的方法进行多线程调用
在写一个项目的时候使用类进行了封装,有多个类(文件),都需要调用,在调用多线程的时候加上了self总是报错,查资料后发现需要在原类中调用线程。代码去掉了一些信息(当时爬取这个网页,不同页数请求还不一样),主要是保留线程的使用方式,具体可参考 python中如何对类的成员函数开启线程?
#!/usr/bin/python
# -*- coding:UTF-8 -*-
import re
import requests
import datetime
from lxml import etree
import threading
import sys
sys.path.append("../")
sys.path.append("./")
import DocumentUtil as DCU
import DownloadUtil as DLU
import DB
from Log import Log
log = Log(__name__).getlog()
class Crawler():
def __init__(self, url='***'):
self.url = url
self.website = '***'
self.baseurl = '***'
self.searchurl = '***'
self.keywords = [keyword[0] for keyword in DB.select('SELECT keywords FROM ***')]
def get_params(self):
params = []
data = {}
for i in range(len(self.keywords)):
data[self.keywords[i]] = 1
for k, v in data.items():
for num in range(1, v + 1):
param = (
('page', str(num)),
('condition', k)
)
params.append(param)
return params
def run(self):
params = self.get_params()
for param in params:
if param[0][1] == '1':
response = DLU.post_html(self.searchurl, params=param)
else:
response = DLU.get_html(self.searchurl, params=param)
html = etree.HTML(response)
contents = html.xpath('//ul[@class="categories li_square col-md-12 col-sm-12 col-xs-12 p0 list_new"]//li')
for content in contents:
title = content.xpath('.//a/@title')[0]
link = self.baseurl + content.xpath('.//a/@href')[0]
release = content.xpath('.//span[@class="col-md-2 col-sm-5 col-xs-12"]//text()')[0].strip()
release = datetime.datetime.strptime(release, '%Y年%m月%d日').strftime('%Y-%m-%d %H:%M:%S')
time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') # 文章的获得时间
DCU.saveDoucment(title, self.website, link, release, time)
def process(self):
th = threading.Thread(target=Crawler.run, args=(self,))
th.start()
th.join()
if __name__ == "__main__":
url = ''
crawler = Crawler(url)
try:
crawler.run()
log.info("end deal list url : %s ******************" % url)
except Exception as e:
log.info("[!] Having some error {}".format(str(e)))
二、selenium 选择下拉框
两种选择框,代码例子均换成自己需要的 xpath
select
选择框li
选择框
1. select
选择框
针对于这种选择框,一般一句话就够了,有很多种形式,详情可参考 Selenium:利用select模块处理下拉框
from selenium.webdriver.support.select import Select
Select(browser.find_element_by_xpath('//select[@id="fe11115"]')).select_by_value("China")
Select(browser.find_element_by_xpath('//select[@id="fe11117"]')).select_by_index("1")
2. li
选择框
找到该标签直接点击就行了,不过一般速度不要太快,不然获取不到
browser.find_element_by_xpath('//*[@id="fe11124"]').click()