python爬虫之selenium 选择下拉框、类中加入线程

写在前面的话: 总结一下学到的内容,还有在做项目中遇到的问题及其解决方式。都是为了学习巩固,有什么不对的地方还希望各位大佬指正出来,不胜感激。

一、在自己的类中加入线程

  • 即类中的方法进行多线程调用

在写一个项目的时候使用类进行了封装,有多个类(文件),都需要调用,在调用多线程的时候加上了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()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值