程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(3)

python爬虫总结

发布于2019-08-07 11:40     阅读(648)     评论(0)     点赞(0)     收藏(2)


python2转成python3的问题:

使用python3下边的2to3.py

打开cmd,进到python安装目录下的  \Tools\scripts文件夹中 输入python 2to3.py -w 目标py文件路径/目标.py

通过这种方式可以将一些格式的区别进行转化。

import格式的区别:

py2和py3的import机制不同,详情可以百度。

比如在A文件夹下有A1.py和A2.py,在py2中,可以直接A1.py导入A2可以直接写成import A2

在py3中,需要改成from A import A2

爬虫过程中的问题:

connect close问题:(如图)

现象: 自己浏览器可以打开,但是爬虫时一直连接close。网上找了一些方法发现没什么用。

解决方法:抓取自己浏览器的数据包,将自己的agent放到爬虫的request里即可正常爬取。怀疑是自己选取的agent数据集太老了,导致无法连接。

此问题只存在于个别网站,原有的agent数据是可以访问大多数网站的。

网站内容列表每个页面都是同样的url问题:

情况1: 当翻页时,可以通过抓包来获取到真实的url

情况2: 通过前端页面可以找到真实的url

情况3:在无法获取到url时,可以通过web driver得到一个页面,然后通过click下一页等按钮来实现翻页

比如可以使用xpath来对button进行定位:

  1. nextPage = driver.find_element_by_xpath("*******")
  2. nextPage.click()

还可以通过执行JavaScript的方式来翻页,比如:

driver.execute_script("javascript:getBidList('153','-1',{0});".format(j))

情况4:抓包无法获取到真实的url,但是可以抓取到json格式的数据包,例如:

  1. { "people": [
  2. { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
  3. { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
  4. { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
  5. ]}

前端页面将这些服务器返回的json数据填入到相应的位置从而结合成我们看到的页面。可以将这些数据用get_text()的方法,然后使用正则匹配即可提取出所需的信息。

正则匹配的问题:

(.*?)解决不了的问题用(.+$)解决了,迷。

正则匹配里的?:是非常好用的。

正则匹配的效果,开始的时候会有很多考虑不到的情况,越往后积累的越多,提取关键词的效果也就越好,感觉还有点机器学习的意思。

解码格式的问题:

字符编码的话改成gbk或者utf-8之类的,换着试,应该总能得到合适的。其中夹杂的一些不可见字符,报错的时候直接replace掉就行了。

  1. soup=BeautifulSoup(html, 'html.parser')
  2. content0 = str(soup).replace(u'\xa0', '').replace(u'\xa5', '')
  3. contents = soup.get_text()
  4. contents1 = contents.encode('gbk', 'ignore')
  5. contents = contents1.decode('gbk')

需要登录的情况,可以找到输入框填充账号和密码,还可以通过cookie登录:

  1. headers ={
  2. 'Host': '*****',
  3. 'Connection': 'keep-alive',
  4. 'Cache-Control': 'max-age=0',
  5. 'Upgrade-Insecure-Requests': '1',
  6. 'User-Agent': '*******',
  7. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
  8. 'Accept-Encoding': 'gzip, deflate, br',
  9. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  10. 'Cookie': '*******'
  11. }
  12. response = requests.get(url, headers = headers)
  13. soup =BeautifulSoup(response.content, 'html.parser')

爬取结果的问题:

存成txt:

存成txt是很简单的,大致逻辑如下:

  1. soup=BeautifulSoup(html,'html.parser')
  2. conent=soup.find('div', class_='content').get_text()
  3. with open ('file.txt','a') as m:
  4. m.write(content)

储存成excel:

python操作excel需要用到xlrd和xlwt两个模块。例如:

  1. myxls = xlwt.Workbook()
  2. sheet1 = myxls.add_sheet(u'sheet1', cell_overwrite_ok=True)
  3. headData = ['姓名', '学号', '班级']
  4. for colnum in range(0, 3):
  5. sheet1.write(0, colnum, headData[colnum], xlwt.easyxf('font: bold on'))
  6. myxls.save('infomation.xls')

直接存入数据库:

还没做

pdf等附件下载的问题:

  1. r = getHtml(url)
  2. f = open(filename, 'wb')
  3. downdown(f, r)
  4. def downdown(f,r):
  5. block = 8192
  6. while True:
  7. buffer = r.read(block)
  8. if not buffer:
  9. break
  10. f.write(buffer)
  11. f.close()

下载附件主要是注意附件的类型,这个在url中应该会有体现,什么类型的文件就储存成什么类型的文件。

表格问题:

有些网站的数据是以表格形式来展示的,如果每个网页的格式都是统一的,那么可以写出一个傻瓜式的代码,直接定位抽取有关信息就行了。但是有的网站每个网页的表格格式都是不一样的,因此采取了先遍历tr,再遍历td的方法,通过正则匹配关键词去寻找要提取的内容。

将表格原始数据保存下来,存成html文件。

  1. pattern_table = re.compile(r'(<table.*?/table>)', re.S)
  2. tbody = re.findall(pattern_table, contents)
  3. table = open('%s.html' % name, "w+")
  4. print(tbody, file=table)
  5. table.close()

其他问题:

附件命名问题:字符串中存在/ \ : * " < > | ?符号,文件名中不能有这个符号,所以报错。可用replace函数去掉。

附件名称可能存在重复,例如当爬取到两个“附件.pdf”时,后边的附件会覆盖掉前边的附件。因此需要改变文件命名的方式,比如使用时间+项目名称的方式等等。



所属网站分类: 技术文章 > 博客

作者:前方一片漆黑

链接:https://www.pythonheidong.com/blog/article/10443/dd8ce62e770172fc2676/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)