[关闭]
@Cleland 2020-03-23T10:03:47.000000Z 字数 22546 阅读 1445

实战合集一

爬虫 AI悦创 实战


你好,我是悦创。

实战项目一:爬取西刺代理(获取代理IP)

爬虫的学习就是与反扒措施、反扒系统做斗争的一个过程,而使用代理 IP 是我们重要的防反扒的重要措施,代理 IP 的来源有两种。
一是:你花钱去购买商家会给你提供一个接口你直接调用就可以了,二是:自己在网上爬取高效IP。在这篇博客中我重点给大家讲一下如何从网上获取高效IP,我们下面的IP来源于西刺代理,这是我很久之前写的一篇博客,今天来进行“翻新”一番希望可以帮助到大家。

1. 安装必要的第三方库

BeautifulSouprequests,BeautifulSoup 负责解析 HTML 网页源码,requests 负责发送请求来获取网页源码,BeautifulSouprequests 均属于 Python 爬虫的基础库,可以通过pip安装。打开命令行输入命令 pip install BeautifulSoup4pip install requests 进行安装:
在这里插入图片描述
过后在输入命令 pip list 在 pip 安装包列表中检查 BeautifulSouprequests 库是否安装成功。
在这里插入图片描述

2. 分析网页结构

待续。。。。

3. 完整代码

  1. #IP地址取自国内髙匿代理IP网站:http://www.xicidaili.com/nn/
  2. from bs4 import BeautifulSoup
  3. import requests,random
  4. def get_ipInfors(url, headers):
  5. '''
  6. 爬取IP数据,单个IP信息以json格式存储,所有json格式的IP数据信息放入列表中
  7. return:ip_infor
  8. '''
  9. web_data = requests.get(url, headers=headers)
  10. soup = BeautifulSoup(web_data.text, 'lxml')
  11. nodes = soup.find_all('tr')
  12. for node in nodes[1:]:
  13. ip_ = node.find_all('td')
  14. ip_address = ip_[1].text
  15. ip_port = ip_[2].text
  16. ip_type = ip_[5].text
  17. ip_time = ip_[8].text
  18. ip_infors = {
  19. "ip_address" : ip_address,
  20. "ip_port" : ip_port,
  21. "ip_type" : ip_type,
  22. "ip_time" : ip_time
  23. }
  24. return ip_infors
  25. def write_ipInfors(ip_infors):
  26. '''
  27. 将IP数据写入文件中
  28. '''
  29. for ip_infor in ip_infors:
  30. f=open('IP.txt','a+',encoding='utf-8')
  31. f.write(ip_infors)
  32. f.write('\n')
  33. f.close()
  34. if __name__ == '__main__':
  35. for i in range(1,10):
  36. url = 'https://www.xicidaili.com/nn/{}'.format(i)
  37. headers = {
  38. 'Host': 'www.xicidaili.com',
  39. 'Referer': 'https://www.xicidaili.com/',
  40. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
  41. }
  42. ip_infors = get_ipInfors(url, headers=headers)
  43. proxies = write_ipInfors(ip_infors)

实战项目二:实现CSDN自动点赞

环境: Python3.6.5
编译器: Sublime Text 3
代码: GitHub
联系方式: ke.zb@qq.com
第三方库: selenium

文章目录

一、思路
二、代码实现
(一)导入第三方库
(二)登录账号
(三)保存cookies到文件中
(四)读取并传入cookies
(五)实现自动点赞
三、完整代码
四、后记

一、思路
在CSDN中,如果实现自动点赞,就必须登录,这就避免不了和 selenium 打交道。Selenium 是一个WEB自动化测试工具,在Python中常用于模拟登陆的实现
实现 CSDN 自动点赞分以下几个步骤:
1. 登录账号
2. 获取并储存 cookies
3. 读取并传入 cookies
4. 实现自动点赞

二、代码实现

(一)导入第三方库

对于 selenium 还没安装的童鞋可以用在命令行中安装

  1. pip install selenium
  1. import time,json,random
  2. from selenium import webdriver

(二)登录账号

在 selenium 安装完成后,需要下一个驱动器(即 chromedriver.exe)
【谷歌驱动器下载】

而后运行代码

  1. driver = webdriver.Chrome(executable_path='chromedriver.exe')
  2. driver.get("https://passport.csdn.net/account/login")

可以看到弹出 CSDN 的登录界面
在这里插入图片描述
CSDN 登录界面

我们这里采用的是账号密码登录方式,我们再来做一个切换,点击“账号登录”

  1. time.sleep(3)
  2. #进入账号密码登录界面
  3. driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()
  4. time.sleep(3)

看到如下界面
在这里插入图片描述
账号登录界面

最后我们清空账号密码框,将自己的 CSDN 账号密码输入进去即可

  1. #清空账号框中的内容
  2. driver.find_element_by_xpath("//input[@name='username']").clear()
  3. print("账号框清空完成")
  4. #自动填入登录用户名
  5. driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
  6. print("账号输入完成")
  7. #清空密码框中的内容
  8. driver.find_element_by_xpath("//input[@name='password']").clear()
  9. #自动填入登录密码
  10. driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
  11. time.sleep(3)
  12. #点击登录
  13. driver.find_element_by_xpath("//input[@class='logging']").click()

大家可能也注意到了我代码上用了很多time.sleep()进行休眠,这个是为了给服务器一个反应时间。拿输入账号密码后的登录操作来举例,如果你在输入账号密码后立即登录,系统会报出账号密码错误的提起,这个是由于我们代码输入账号密码的速度太快了,服务器还没接收到你输入的信息,代码就已经登录操作了,它自然会给你报错。当然人工输入是不会遇到这个问题的,你速度没那么快嘛。

(三)保存cookies到文件中

在介绍下面的内容前,我先来介绍几个知识点

  1. #获取并保存cookies
  2. cookies = driver.get_cookies()
  3. with open("cookies.txt", "w") as fp:
  4. json.dump(cookies, fp)

(四)读取并传入cookies

这里我么将事先存入cookies.txt文件中的cookies提取出来加载进去即可。这里我补充一些webdriver中提供了操作cookie的相关方法:

  1. driver = webdriver.Chrome(executable_path='chromedriver.exe')
  2. driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
  3. with open("cookies.txt", "r") as fp:
  4. cookies = json.load(fp)
  5. for cookie in cookies:
  6. driver.add_cookie(cookie)

(五)实现自动点赞

  1. driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
  2. time.sleep(3)
  3. driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
  4. print("点赞完成!")
  5. time.sleep(3)

完。。。。

三、完整代码

  1. #CSDN自动点赞
  2. import time,json,random
  3. from selenium import webdriver
  4. #CSDN账号
  5. account_CSDN = "你的账号"
  6. #CSDN密码
  7. password_CSDN = "你的密码"
  8. def CSDN_login():
  9. '''
  10. 登录CSDN并保存cookies
  11. '''
  12. driver = webdriver.Chrome(executable_path='chromedriver.exe')
  13. driver.get("https://passport.csdn.net/account/login")
  14. time.sleep(3)
  15. #进入账号密码登录界面
  16. driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()
  17. time.sleep(3)
  18. #清空账号框中的内容
  19. driver.find_element_by_xpath("//input[@name='username']").clear()
  20. print("账号框清空完成")
  21. #自动填入登录用户名
  22. driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
  23. print("账号输入完成")
  24. #清空密码框中的内容
  25. driver.find_element_by_xpath("//input[@name='password']").clear()
  26. #自动填入登录密码
  27. driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
  28. time.sleep(3)
  29. #点击登录
  30. driver.find_element_by_xpath("//input[@class='logging']").click()
  31. #获取并保存cookies
  32. cookies = driver.get_cookies()
  33. with open("cookies.txt", "w") as fp:
  34. json.dump(cookies, fp)
  35. def dianZan(url_list):
  36. '''
  37. 实现自动点赞功能
  38. '''
  39. driver = webdriver.Chrome(executable_path='chromedriver.exe')
  40. driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
  41. with open("cookies.txt", "r") as fp:
  42. cookies = json.load(fp)
  43. for cookie in cookies:
  44. driver.add_cookie(cookie)
  45. print("cookies加载完成,成功登录")
  46. time.sleep(3)
  47. driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
  48. time.sleep(3)
  49. driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
  50. print("点赞完成!")
  51. time.sleep(3)
  52. if __name__ == '__main__':
  53. url_list = ""
  54. CSDN_login()
  55. dianZan(url_list)

四、后记

如果觉得我写得可以点个赞呗;如果有什么不足的地方,还你希望可以在下方留言告诉我。

实战项目三:爬取QQ群中的人员信息

文章目录

一、selenium简介
(一)实例说明
(二)元素定位方式
(三)实现滚动条自动下拉
二、Xpath简介
(一)语法:
(二)实例:
三、定义一个爬虫类
(一)导入包
(二)初始化类
(三)滚动条自动下拉
(四)获取Tbody标签的列表
(五)解析Tbody标签
(六)提取Tbody标签中每个群员的信息
(七)将提取到群员的信息写入文件
四、主函数

一、selenium简介

我们模拟登陆用的是 selenium 库,selenium 是一个自动化测试工具,在爬虫中通常用来进行模拟登陆。

(一)实例说明

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.get('http://www.baidu.com/')

代码功能:

  1. 打开谷歌浏览器,
  2. 自动输入百度网址并打开百度

如果程序执行错误,浏览器没有打开,那么应该是没有装 Chrome 浏览器或者 Chrome 驱动没有配置在环境变量里。下载驱动,然后将驱动文件路径配置在环境变量即可。
谷歌浏览器驱动下载

(二)元素定位方式

单个元素选取:

  1. find_element_by_id
  2. find_element_by_name
  3. find_element_by_xpath
  4. find_element_by_link_text
  5. find_element_by_partial_link_text
  6. find_element_by_tag_name
  7. find_element_by_class_name
  8. find_element_by_css_selector

多个元素选取:

  1. find_elements_by_name
  2. find_elements_by_xpath
  3. find_elements_by_link_text
  4. find_elements_by_partial_link_text
  5. find_elements_by_tag_name
  6. find_elements_by_class_name
  7. find_elements_by_css_selector

代码示例:

  1. #获取网页中的h1标签
  2. h1 = driver.find_element_by_name("h1")
  3. #获取网页中所有的h1标签
  4. h1_list = driver.find_elements_by_name("h1")

(三)实现滚动条自动下拉

代码展示:

  1. #将滚动条移动到页面的底部
  2. js="var q=document.documentElement.scrollTop=100000"
  3. driver.execute_script(js)

二、Xpath简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。结构关系包括 父、子、兄弟、先辈、后代等。

(一)语法:

表达式 功能描述
nodename 选取此节点的所有子节点
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
选取当前节点的父节点。
@ 选取属性。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

(二)实例:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

更多语法知识参考:Xpath实现信息提取

代码实例:

  1. #获取 class 为 bold 的标签名
  2. result = html.xpath('//*[@class="bold"]')

三、定义一个爬虫类

(一)导入包

  1. import time
  2. from selenium import webdriver

(二)初始化类

  1. class qqGroupSpider():
  2. '''
  3. Q群爬虫类
  4. '''
  5. def __init__(self, driver,qq,passwd,qqgroup):
  6. '''
  7. 初始化根据用户信息登录到Q群管理界面
  8. :param driver:
  9. :param qq:
  10. :param passwd:
  11. :param qqgroup:
  12. :param writefile:
  13. '''
  14. url = "https://qun.qq.com/member.html#gid={}".format(qqgroup)
  15. self.driver=driver
  16. driver.delete_all_cookies()
  17. driver.get(url)
  18. time.sleep(1)
  19. driver.switch_to.frame("login_frame") # 进入登录iframe
  20. time.sleep(1)
  21. change = driver.find_element_by_id("switcher_plogin")
  22. change.click()
  23. driver.find_element_by_id('u').clear() # 选择用户名框
  24. driver.find_element_by_id('u').send_keys(qq)
  25. driver.find_element_by_id('p').clear()
  26. driver.find_element_by_id('p').send_keys(passwd)
  27. driver.find_element_by_class_name("login_button").click()
  28. time.sleep(1)

(三)滚动条自动下拉

  1. def scroll_foot(self,driver):
  2. '''
  3. 控制屏幕向下滚动到底部
  4. :param driver:
  5. :return:
  6. '''
  7. js = "var q=document.documentElement.scrollTop=100000"
  8. return driver.execute_script(js)

(四)获取Tbody标签的列表

  1. def getTbodyList(self, driver):
  2. print("getTbodyList()函数运行过")
  3. return driver.find_elements_by_xpath('//div[@class="group-memeber"]//tbody[contains(@class,"list")]')

(五)解析Tbody标签

  1. def parseTbody(self, html):
  2. '''
  3. 解析tbody里面的内容,一个tbody里面有多个成员,
  4. 解析完成后,返回成员基本情况的列表
  5. :param html:
  6. :return:
  7. '''
  8. # selector = etree.HTML(html)
  9. print("parseTbody()函数运行过")
  10. memberLists = []
  11. for each in html:
  12. memberList = each.find_elements_by_xpath('tr[contains(@class,"mb mb")]')
  13. memberLists += memberList
  14. print("memberLists长度为:{}".format(len(memberLists)))
  15. memberLists_data = []
  16. for each in memberLists:
  17. memberLists_data.append(self.parseMember(each))
  18. return memberLists_data

(六)提取Tbody标签中每个群员的信息

  1. def parseMember(self, mb):
  2. '''
  3. 解析每个人各项描述,以逗号隔开,返回一个成员的基本情况
  4. :param mb:
  5. :return:
  6. '''
  7. print("parseMember()函数运行过")
  8. td = mb.find_elements_by_xpath('td')
  9. print("td长度为:{}".format(len(td)))
  10. qId = td[1].text.strip()
  11. nickName = td[2].find_element_by_xpath('span').text.strip()
  12. card = td[3].find_element_by_xpath('span').text.strip()
  13. qq = td[4].text.strip()
  14. sex = td[5].text.strip()
  15. qqAge = td[6].text.strip()
  16. joinTime = td[7].text.strip()
  17. lastTime = td[8].text.strip()
  18. a = (qId + "|" + qq + "|" + nickName + "|" + card + "|" + sex + "|" + qqAge + "|" + joinTime + "|" + lastTime)
  19. print(a)
  20. return a

(七)将提取到群员的信息写入文件

  1. def parseAndWrite(self, tbody):
  2. '''
  3. 解析HTML中的tbody,解析完成后写入到本地文件
  4. :param tbody:
  5. :return:
  6. '''
  7. print("parseAndWrite()函数运行过")
  8. memberList = self.parseTbody(tbody)
  9. with open("1607.csv", 'a+', encoding="utf-8") as f:
  10. for each in memberList:
  11. f.write(str(each)+"\n")

四、主函数

  1. def main():
  2. qq = "你的QQ账号"
  3. passwd = "你的QQ密码"
  4. qqgroup = "想要爬取的QQ群群号"
  5. driver = webdriver.Chrome()
  6. spider=qqGroupSpider(driver,qq,passwd,qqgroup)
  7. time.sleep(10)
  8. # 找到QQ群的人数
  9. qqNum = int(driver.find_element_by_xpath('//*[@id="groupMemberNum"]').text.strip())
  10. print("QQ群人数为:"+str(qqNum))
  11. curren_qq_num=0
  12. prelen=0
  13. while curren_qq_num != qqNum:
  14. curren_qq_num=len(driver.find_elements_by_xpath('//*[@id="groupMember"]//td[contains(@class,"td-no")]'))
  15. #不停的向下滚动屏幕,直到底部
  16. spider.scroll_foot(driver)
  17. #每次滚动休息1秒
  18. time.sleep(1)
  19. tlist = spider.getTbodyList(driver)
  20. spider.parseAndWrite(tlist[prelen:])
  21. prelen = len(tlist)#更新tbody列表的长度
  22. driver.quit()
  23. if __name__ == '__main__':
  24. main()

实战项目四:爬取911网站

这是我在某个项目写的一份爬虫代码,今天将它整理一下分享给大家,仅供参考学习,请勿用作其他用途。

需要爬取的东西

我爬取的是 https://myingwenming.911cha.com 网站,采集的是网站中的中文音译、名字性别、来源语种、名字寓意、名字印象、名字含义6个数据。我分别设置 namesChineseTransliteration、namesGender、namesFromLanguage、namesMoral、namesImpression、namesMeaning 等6个字段来存放相应的数据。

在这里插入图片描述

防反扒措施

在这防反扒这一块我选择每发送一次 requests 请求更换一个 User-AgentIPUser-Agent 的更换我依靠第三方库 fake_useragent 来完成,在每次发送 requests 请求前通过 {'User-Agent':str(UserAgent().random)} 语句来获取一个随机 User-Agent。关于 代理 IP 这块我则是事先准备好IP存放到 IP.txt 文件中,每一次发送 requests 前从该文件中随机获取一个IP 用于本次请求。

  1. def get_ip_list():
  2. '''
  3. 读取IP.txt中的数据
  4. '''
  5. f=open('IP.txt','r')
  6. ip_list=f.readlines()
  7. f.close()
  8. return ip_list
  9. def get_random_ip(ip_list):
  10. '''
  11. 从IP列表中获取随机IP
  12. '''
  13. proxy_ip = random.choice(ip_list)
  14. proxy_ip=proxy_ip.strip('\n')
  15. proxies = {'http': proxy_ip}
  16. return proxies

关于 requests 请求
我这里的requests请求供包含url、proxies、headers、timeout、verify五个参数,在每一次发送请求前更换新的proxies,headers并在超时处理,若请求时间超过10秒则中断本次请求,设置verify=False则会忽略对网页证书的验证。

在我遇到的反扒系统中有这样一种,拿出来和大家分享。对方识别到你的爬虫在网站上爬行时,不会阻止它的爬取行为而是让其陷入一种死循环转态,表现的形式是:本报错同时也不会返回任何数据。在 requests 请求中加上一个超时设置就可以很好避开该反扒措施。

关于网页解析
在网页解析这块我选择的是 Python 解析库 BeautifulSoup4 与解析器 lxml ,在定位方面我选择的是 find()find_all()find() 返回的是单个结点,find_all() 返回结点列表,在提取文本信息中我这里使用的是 get_text()

首先定位到 <div class="pp"> ,其次是 div 下的 p 标签,最后分别存入对应的字段当中。

  1. soup = BeautifulSoup(r.text, 'lxml')
  2. body = soup.find("div", class_="pp")
  3. contents = body.find_all('p')

在这里插入图片描述

完整代码

  1. from fake_useragent import UserAgent
  2. from bs4 import BeautifulSoup
  3. import pandas as pd
  4. import requests,csv,time,random
  5. def get_ip_list():
  6. '''
  7. 读取IP.txt中的数据
  8. '''
  9. f=open('IP.txt','r')
  10. ip_list=f.readlines()
  11. f.close()
  12. return ip_list
  13. def get_random_ip(ip_list):
  14. '''
  15. 从IP列表中获取随机IP
  16. '''
  17. proxy_ip = random.choice(ip_list)
  18. proxy_ip=proxy_ip.strip('\n')
  19. proxies = {'http': proxy_ip}
  20. return proxies
  21. def parsePage(url,ip_list):
  22. '''
  23. 爬取网页并返回所需信息以及状态码
  24. '''
  25. headers= {'User-Agent':str(UserAgent().random)}
  26. proxies = get_random_ip(ip_list)
  27. try:
  28. #verify设置为False,Requests也能忽略对SSL证书的验证。
  29. r = requests.get(url, proxies=proxies, headers=headers, timeout=10,verify=False)
  30. except:
  31. print('运行错误,程序暂停20秒')
  32. time.sleep(20)
  33. headers= {'User-Agent':str(UserAgent().random)}
  34. proxies = get_random_ip(ip_list)
  35. r = requests.get(url, proxies=proxies, headers=headers, timeout=10, verify=False)
  36. #状态码status_code为200代表爬取成功,为404则为未爬取到相关信息
  37. if r.status_code == 200:
  38. soup = BeautifulSoup(r.text, 'lxml')
  39. body = soup.find("div", class_="pp")
  40. contents = body.find_all('p')
  41. return r.status_code, contents
  42. else:
  43. return r.status_code, None
  44. def getDict(contents):
  45. namesChineseTransliteration = [] #中文音译
  46. namesGender = [] #名字性别
  47. namesFromLanguage = [] #来源语种
  48. namesMoral = [] #名字寓意
  49. namesImpression = [] #名字印象
  50. namesMeaning = [] #名字含义
  51. namesChineseTransliteration.append(contents[1].get_text()[4:])
  52. namesGender.append(contents[-5].get_text()[4:])
  53. namesFromLanguage.append(contents[-4].get_text()[4:])
  54. namesMoral.append(contents[-3].get_text()[4:])
  55. namesImpression.append(contents[-2].get_text()[4:])
  56. namesMeaning.append(contents[-1].get_text()[4:])
  57. str_row=namesChineseTransliteration+namesGender+namesFromLanguage+namesMoral+namesImpression+namesMeaning
  58. return str_row
  59. def write_file(filePath, row):
  60. with open(filePath,'a+',encoding='utf-8',newline='') as csvfile:
  61. spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  62. spanreader.writerow(row)
  63. if __name__ == "__main__":
  64. names = pd.read_csv("name_data.csv")['name'] #获取需要爬取文件的名字
  65. base_url = "https://myingwenming.911cha.com/"
  66. ip_list = get_ip_list()
  67. for name in names:
  68. url = base_url + name + ".html"
  69. status_code, contents = parsePage(url,ip_list)
  70. print("{}检索完成".format(name), "状态码为:{}".format(status_code))
  71. #状态码为200爬取成功,状态码为404爬取失败
  72. if status_code == 200:
  73. str_row = getDict(contents)
  74. row = ["{}".format(name)] + str_row
  75. write_file("new.csv",row)
  76. else:
  77. continue

有不明的地方在下方留言,我看到后会尽快回复的

实战项目五:抓取简书文章信息

源码:

  1. from fake_useragent import UserAgent
  2. from lxml import etree
  3. import lxml,requests
  4. url="https://www.jianshu.com/c/qqfxgN?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq"
  5. def getHtml(url):
  6. '''
  7. 获取网页源码
  8. return html
  9. '''
  10. headers = {
  11. "Host": "www.jianshu.com",
  12. "Referer": "https://www.jianshu.com/",
  13. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
  14. }
  15. req = requests.get(url, headers=headers)
  16. html = etree.HTML(req.text)
  17. return html
  18. def parse(html):
  19. '''
  20. 解析网页
  21. '''
  22. nodes = html.xpath("//ul[@class='note-list']/li//div[@class='content']")
  23. for node in nodes:
  24. title = node.xpath(".//a[@class='title']/text()")[0]
  25. nickname = node.xpath(".//div[@class='meta']/a/text()")[0]
  26. comment = node.xpath(".//div[@class='meta']/a//text()")[2].strip()
  27. like = node.xpath(".//div[@class='meta']/span/text()")[0].strip()
  28. essay = {
  29. "title" : title,
  30. "nickname" : nickname,
  31. "comment" : comment,
  32. "like" : like
  33. }
  34. print("文章信息:{}".format(essay))
  35. def main():
  36. html = getHtml(url)
  37. parse(html)
  38. if __name__ == '__main__':
  39. main()

Python3--批量爬取数据之调金山词霸api进行翻译

上代码:

  1. #/usr/bin/env python3
  2. #coding=utf8
  3. from fake_useragent import UserAgent
  4. import http.client
  5. import hashlib
  6. import urllib
  7. import random,csv
  8. import json,time
  9. import requests
  10. #获取IP列表并检验IP的有效性
  11. def get_ip_list():
  12. f=open('IP.txt','r')
  13. ip_list=f.readlines()
  14. f.close()
  15. return ip_list
  16. #从IP列表中获取随机IP
  17. def get_random_ip(ip_list):
  18. proxy_ip = random.choice(ip_list)
  19. proxy_ip=proxy_ip.strip('\n')
  20. proxies = {'https': proxy_ip}
  21. return proxies
  22. #注释:a若查找不到中人名则返回a(row[6])
  23. def getTransResult(q):
  24. type = "json"
  25. q = q.lower()
  26. myurl = 'http://dict-co.iciba.com/api/trans/vip/translate'
  27. #q = 'hello baidu trans' #要翻译的内容
  28. myurl = "http://dict-co.iciba.com/api/dictionary.php?w="+q+"&type="+type+"&key=key" #开发者Key
  29. ip_list = get_ip_list()
  30. proxies = get_random_ip(ip_list)
  31. headers = { 'User-Agent':str(UserAgent().random)}
  32. try:
  33. time.sleep(1)
  34. req=requests.get(myurl,headers=headers,proxies=proxies)
  35. except:
  36. print('程序出错,暂停20秒')
  37. time.sleep(20)
  38. proxies = get_random_ip(ip_list)
  39. headers = { 'User-Agent':str(UserAgent().random)}
  40. req=requests.get(myurl,headers=headers,proxies=proxies)
  41. req.encoding="utf-8"
  42. data = req.text
  43. mresult = json.loads(data)
  44. getTransResult=''
  45. try:
  46. getTransResult = mresult['symbols'][0]['parts'][0]['means'][0]
  47. except:
  48. return getTransResult
  49. print('翻译结果为:'+getTransResult)
  50. return getTransResult
  51. #功能:读取文件并处理
  52. def read_file(filepath):
  53. reader=[]
  54. with open(filepath,'r') as csvfile:
  55. spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  56. for row in spanreader:
  57. if row:
  58. reader.append(row)
  59. return reader
  60. #功能:将爬取到的内容写入文件
  61. #注意事项:写文件时open中要加上newline='',否则写一行后程序会自动换行
  62. def write_file(filepath,row):
  63. with open(filepath,'a+',encoding='utf-8',newline='') as csvfile:
  64. spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  65. spanreader.writerow(row)
  66. if __name__ == "__main__":
  67. reader = read_file('S_baiduBaike_youdaoChinese_utf-8.csv')
  68. for row in reader:
  69. if not row[6]:
  70. print('现在爬取的人名是:'+row[0])
  71. TransResult = getTransResult(row[0])
  72. if not TransResult.find('[人名]')==-1:
  73. TransResult=TransResult.replace('[人名]','')
  74. row[6] = TransResult
  75. elif not TransResult.find('[男子名]')==-1:
  76. TransResult=TransResult.replace('[男子名]','')
  77. row[6] = TransResult
  78. elif not TransResult.find('[女子名]')==-1:
  79. TransResult=TransResult.replace('[女子名]','')
  80. row[6] = TransResult
  81. write_file('经有道金山词霸爬取后/S_baiduBaike_youdaoChinese_jscb.csv',row)
  82. print('程序运行结束')

Python3--批量爬取数据之调用百度api进行翻译

  1. #************************************************************
  2. #文件功能:利用百度翻译将英文名翻译成中文
  3. #************************************************************
  4. import csv,requests,random
  5. from fake_useragent import UserAgent
  6. import hashlib
  7. import json
  8. import time
  9. import urllib.parse
  10. class Baidufanyi:
  11. """docstring for ClassName"""
  12. def __init__(self, appid, appSecret, ip_list):
  13. self.url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
  14. self.ip_list = ip_list #ip列表
  15. self.appid = appid #应用ID
  16. self.appSecret = appSecret #应用密钥
  17. self.langFrom = 'en' #翻译前语言
  18. self.langTo = 'zh' #翻译后语言
  19. '''
  20. 功能:将数据url编码
  21. 注释:param queryText:待翻译的文字
  22. return:返回url编码过的数据
  23. '''
  24. def getUrlEncodeData(self,queryText):
  25. salt = '2' #我们将随机数固定为2
  26. sign_str = self.appid + queryText + salt + self.appSecret
  27. sign_str = sign_str.encode('utf-8')
  28. sign = hashlib.md5(sign_str).hexdigest()
  29. payload = {
  30. 'q': queryText,
  31. 'from': self.langFrom,
  32. 'to': self.langTo,
  33. 'appid': self.appid,
  34. 'salt': salt,
  35. 'sign': sign
  36. }
  37. # 注意是get请求,不是请求
  38. data = urllib.parse.urlencode(payload)
  39. return data
  40. '''''
  41. 解析页面,输出翻译结果
  42. :param html: 翻译返回的页面内容
  43. :return: None
  44. '''
  45. def parseHtml(self, html):
  46. data = json.loads(html)
  47. print ('-------------------------')
  48. translationResult = data['trans_result'][0]['dst']
  49. if isinstance(translationResult, list):
  50. translationResult = translationResult[0]
  51. print (translationResult)
  52. return translationResult
  53. def get_translateResult(self,queryText):
  54. data = self.getUrlEncodeData(queryText) #获取url编码过的数据
  55. target_url = self.url + '?' + data #构造目标url
  56. print('target_url为:'+target_url)
  57. headers = {'User-Agent':'str(UserAgent().random)'}
  58. try:
  59. proxies = get_randomIp(self.ip_list)
  60. req = requests.get(target_url,proxies=proxies,headers=headers,timeout=10) #构造请求
  61. except:
  62. print('运行错误,暂停20秒')
  63. proxies = get_randomIp(self.ip_list)
  64. req = requests.get(target_url,proxies=proxies,headers=headers) #再次进行构造请求
  65. req.encoding='utf-8'
  66. html = req.text
  67. translateResult = self.parseHtml(html) #解析,显示翻译结果
  68. return translateResult
  69. #获取IP列表并检验IP的有效性
  70. def get_ipList():
  71. f=open('IP.txt','r')
  72. ip_list=f.readlines()
  73. f.close()
  74. return ip_list
  75. #从IP列表中获取随机IP
  76. def get_randomIp(ip_list):
  77. proxy_ip = random.choice(ip_list)
  78. proxy_ip=proxy_ip.strip('\n')
  79. proxies = {'http': proxy_ip}
  80. return proxies
  81. #功能:获取需要翻译的文件内容
  82. def reader_file(filePath):
  83. reader=[]
  84. with open(filePath,'r',encoding='utf-8') as csvfile:
  85. spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  86. for row in spanreader:
  87. if row:
  88. reader.append(row)
  89. return reader
  90. #功能:将信息写入文件
  91. def write_file(filePath,row):
  92. with open(filePath,'a+',encoding='utf-8',newline='') as csvfile:
  93. spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  94. spanreader.writerow(row)
  95. #主程序
  96. def main():
  97. print('程序开始运行!')
  98. appid = appid #应用ID
  99. appSecret = appSecret #应用密钥
  100. filePath = 'baidubaike.csv' #需要翻译的文件
  101. ip_list = get_ipList()
  102. fanyi = Baidufanyi(appid,appSecret,ip_list)
  103. reader = reader_file(filePath)
  104. for row in reader:
  105. translateResult = '翻译成功后的结果' #翻译成功后的结果
  106. if not row[6]:
  107. print('现在翻译的英文名是:'+row[0])
  108. translateResult = fanyi.get_translateResult(row[0])
  109. print('翻译成功后的结果是:'+translateResult)
  110. row[6] = translateResult
  111. write_file('baidubaike_notChinese.csv',row) #将爬取过的内容存入test.csv文件
  112. else:
  113. write_file('baidubaike_Chinese.csv',row) #将未进行爬取的内容存进test_.csv文件
  114. print('信息爬取成功,程序运行结束')
  115. if __name__ == '__main__':
  116. main()

Python3--批量爬取数据之调用有道api进行翻译

  1. # coding=utf-8
  2. import urllib,urllib.request
  3. from fake_useragent import UserAgent
  4. import json
  5. import time
  6. import hashlib
  7. import urllib.parse
  8. import requests
  9. import random
  10. import csv,re
  11. class YouDaoFanyi:
  12. def __init__(self, appKey, appSecret):
  13. self.url = 'https://openapi.youdao.com/api/'
  14. self.headers = { 'User-Agent':str(UserAgent().random)}
  15. self.appKey = appKey # 应用id
  16. self.appSecret = appSecret # 应用密钥
  17. self.langFrom = 'EN' # 翻译前文字语言,auto为自动检查
  18. self.langTo = 'zh-CHS' # 翻译后文字语言,auto为自动检查
  19. def getUrlEncodedData(self, queryText):
  20. '''
  21. 将数据url编码
  22. :param queryText: 待翻译的文字
  23. :return: 返回url编码过的数据
  24. '''
  25. salt = '2' # 产生随机数 ,其实固定值也可以,不如"2"
  26. sign_str = self.appKey + queryText + salt + self.appSecret
  27. sign_str=sign_str.encode('utf-8')
  28. sign = hashlib.md5(sign_str).hexdigest()
  29. payload = {
  30. 'q': queryText,
  31. 'from': self.langFrom,
  32. 'to': self.langTo,
  33. 'appKey': self.appKey,
  34. 'salt': salt,
  35. 'sign': sign
  36. }
  37. # 注意是get请求,不是请求
  38. data = urllib.parse.urlencode(payload)
  39. return data
  40. def parseHtml(self, html):
  41. '''
  42. 解析页面,输出翻译结果
  43. :param html: 翻译返回的页面内容
  44. :return: None
  45. '''
  46. data = json.loads(html)
  47. print ('-------------------------')
  48. translationResult = data['translation']
  49. if isinstance(translationResult, list):
  50. translationResult = translationResult[0]
  51. print (translationResult)
  52. return translationResult
  53. def translate(self, queryText):
  54. data = self.getUrlEncodedData(queryText) # 获取url编码过的数据
  55. target_url = self.url + '?' + data # 构造目标url
  56. # request = urllib2.Request(target_url, headers=self.headers) # 构造请求
  57. ip_list=get_ip_list()
  58. proxies=get_random_ip(ip_list)
  59. print('随机ip为:'+str(proxies))
  60. req = requests.get(target_url,proxies=proxies, headers=self.headers) # 构造请求
  61. # with request.urlopen(request) as response111: # 发送请求
  62. req.encoding='utf-8'
  63. html=req.text
  64. translationResult=self.parseHtml(html) # 解析,显示翻译结果
  65. return translationResult
  66. #功能:读取文件并处理
  67. def read_file(filepath):
  68. reader=[]
  69. with open(filepath,'r',encoding='utf-8') as csvfile:
  70. spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  71. for row in spanreader:
  72. if row:
  73. reader.append(row)
  74. return reader
  75. #功能:将爬取到的内容写入文件
  76. #注意事项:写文件时open中要加上newline='',否则写一行后程序会自动换行
  77. def write_file(filepath,row):
  78. with open(filepath,'a+',encoding='utf-8',newline='') as csvfile:
  79. spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
  80. spanreader.writerow(row)
  81. #获取IP列表并检验IP的有效性
  82. def get_ip_list():
  83. f=open('IP.txt','r')
  84. ip_list=f.readlines()
  85. f.close()
  86. return ip_list
  87. #从IP列表中获取随机IP
  88. def get_random_ip(ip_list):
  89. proxy_ip = random.choice(ip_list)
  90. proxy_ip=proxy_ip.strip('\n')
  91. proxies = {'http': proxy_ip}
  92. return proxies
  93. if __name__ == "__main__":
  94. print('程序开始运行!')
  95. appKey = '应用id' # 应用id
  96. appSecret = '应用密钥' # 应用密钥
  97. fanyi = YouDaoFanyi(appKey, appSecret)
  98. reader=read_file('E_baiduBaike_notHaveChinese.csv')
  99. for row in reader:
  100. print('现在翻译的人名是:'+row[0])
  101. translationResult=fanyi.translate(row[0])
  102. print('翻译结果为:'+str(translationResult))
  103. zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
  104. if zhPattern.search(translationResult):
  105. row[6]=translationResult
  106. write_file('经有道翻译处理后的文件/E_baiduBaike_youdaoChinese.csv',row)
  107. print('爬取完成')

在这里插入图片描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注