zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python采集库DrissionPage

Python 采集 DrissionPage
2023-06-13 09:13:01 时间

Xpath遇到一些问题,总是提取不到文本。

DrissionPage进入视野。219个星星不算多。

https://gitee.com/muzi-lee/DrissionPage

https://github.com/g1879/DrissionPage/blob/master/README.zh-cn.md

page = MixPage()  # 创建页面对象,默认driver模式
page.get('https://gitee.com/profile')  # 访问个人中心页面(未登录,重定向到登录页面)


lnk = first_col.ele('text:命令学')# 使用文本内容查找元素 
#ele()返回第一个符合条件的元素,eles()返回所有符合条件的元素列表。
#元素查找超时默认为10秒,你也可以按需要设置。如查询参数是字符串,
#可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。
# 根据xpath或css selector查找
page.eles('xpath://div[@class="ele_class"]')  page.eles('css:div.ele_class')
page.ele('search text')  # 查找包含传入文本的元素 


# 获取元素文本
text = lnk.text  
# 操作元素
element.click()  
# 点击元素
element.input(text)  
# 输入文字
element.run_script(js)  
# 运行js
element.submit()  
# 提交表单
element.clear()  
# 清空元素

self.ele(f'xpath:{self.xpath_下一页}').click() #点击下一页

# 操作页面

print(page.html)  
# 页面源代码
page.run_script(js)  
# 运行js语句
page.close_other_tabs(num)  
# 关闭其它标签页
page.to_iframe(iframe)  
# 切入iframe
page.screenshot(path)  
# 页面截图
page.scrool_to_see(element)  
# 滚动直到某元素可见

# 切换模式
page.change_mode() # 切换到session模式

href = lnk.attr('href')  # 获取元素属性值
在这里坑了一个下午:)

1、获得一级页面和内容

p = MixPage('s')
#p = MixPage()
#循环获得一级页面
for i in range(1,3):
    print(i)
    p.get('https://BB%BA%E9%80%A0%E5%B8%88%E5%B8%82%E6%94%BF&page='+str(i))

    #搜索一级页面的内容和URL
    lnk = p.eles('@class:posName')  # 使用文本内容查找元素 职位名称
#    companys = p.eles('@class:w2') #公司名称
    companys = p.eles('@class:entName')
    money = p.eles('@class:w3') #薪资
#    money = p.eles('000') #薪资
    workplace = p.eles('@class:w4') #工作地点
    update_time = p.eles('@class:w5') #更新时间

2、获得二级页面和内容

    for i in range(0,len(lnk)): #遍历url
        print(lnk[i].text,end='')
        print(companys[i].text,end='')
        print(money[i].text,end='')
        
        href = lnk[i].attr('href')  # 获取元素属性值
        p.get(href) #进入二级页面
        
        sleep(1)
        
        salary = p.ele('@class:salary') #薪资
#        Job_responsibilities = p.ele('岗位职责')
        Job_responsibilities = p.ele('@id:examineSensitiveWordsContent') #职位描述
        phone = p.ele('联系电话')
        company_address = p.ele('联系地址') #联系地址
        ent_name = p.ele('@class:ent-name') #ent-name
        Contact_address = p.ele('@class:address') #address

3、内容写入CSV

        #写入csv
        with open('广西.csv', 'a+', newline = '\n')as f:
            w = csv.writer(f)
            w.writerow([datetime.date.today() #写入当前日期
                        ,lnk[i].text
                        ,companys[i].text
                        ,money[i].text
                        ,workplace[i].text
                        ,update_time[i].text
                        ,salary.text
                        ,Job_responsibilities.text
                        ,phone.text
                        ,company_address.text
                        ,ent_name.text
                        ,Contact_address.text
                        ,href
                        ])

4、读取csv,判断出现次数和区域。使用了字典方法,累计出现次数填入字典。

import csv

with open('广西.csv', 'r', newline = '\n')as f:
    reader = csv.reader(f)
    dict = {}
    for row in reader:
         dict[row[2]]=dict.get(row[2],0)+1

for x,y in dict.items():
    print(y)
    if y == 1:
        print(x,y)
        if 'xx区' in row[9]:
            print(row[9])

5、发邮件推送

#发邮件
        import yagmail
        yag_server = yagmail.SMTP(user='41710@qq.com', password='gewuhxbjcd', host='smtp.qq.com',encoding='GBK')
        email_to = ['165841@qq.com']
        import datetime
        t = datetime.date.today()
        email_title = x
        email_content = row[12]
        yag_server.send(email_to, email_title, email_content)
        yag_server.close()