python爬虫总结

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进行定位:

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

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

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

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

 { "people": [
 { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
 { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
 { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
 ]}

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

正则匹配的问题:

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

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

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

解码格式的问题:

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

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

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

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

爬取结果的问题:

存成txt:

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

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

储存成excel:

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

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

直接存入数据库:

还没做

pdf等附件下载的问题:

r = getHtml(url)
f = open(filename, 'wb')
downdown(f, r)
def downdown(f,r):
    block = 8192
    while True:
        buffer = r.read(block)
        if not buffer:
            break
        f.write(buffer)
    f.close()

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

表格问题:

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

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

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

其他问题:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值