首先需要一个配置一个headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.70',
'cookie': 'global_cookie=br7ityabwlw3ydkkiyftwmxkl2wl7k8q6hz; __utmc=147393320; csrfToken=1Nt6Yg1uytSK4OHW7y6jP5Mo; lastscanpage=0; city=xz; __utma=147393320.1501214221.1662108907.1662120134.1662123033.4; __utmz=147393320.1662123033.4.3.utmcsr=search.fang.com|utmccn=(referral)|utmcmd=referral|utmcct=/; token=c082b197338e478e86b347d00a39f6b9; sfut=B70357F0376DD223100D3F60E3D5DF3151127A3E35991765579C71E8A9011E93FBBF33904732E37DD698B6E5D50A415B7DE54190DFC7B6E1DF5F73C8875A5A0959C2DADBF9E1A2F760BEF968816BB18782DA291CD47821A44AE8F8162D271F466A176E793F4BFD63; g_sourcepage=esf_xq%5Elb_pc; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; new_loginid=126906171; login_username=fang13939063538; unique_cookie=U_br7ityabwlw3ydkkiyftwmxkl2wl7k8q6hz*86; __utmb=147393320.11.10.1662123033'
}
r = requests.get(url = traget_url , headers = headers)
soup = BeautifulSoup(r.text,'lxml)
page_url = soup.find(name='div', attrs={'class': 'fanye gray6'})
上面代码就是寻找div标签中class等于fanye gray6的元素,但是find在找到目标后就不会继续寻找
page_url = soup.find_all(name='div', attrs={'class': 'fanye gray6'})
print(page_url[0])
find_all函数是会寻找网页中所有符合该条件的元素,并使用列表存贮下来,如果要读取某一个可以按照列表的方式进行读取
info = re.sub('- |
- ]*>|
', '\n', info)
# '\n\n本\xa0月\xa0均\xa0价\n\n\n12081元/㎡
\n\n\n\n\n小区均价仅供参考,不可作为交易等依据
\n\n\n\n\n'
info = info.strip('\n') # 去掉首位换行符
# '本\xa0月\xa0均\xa0价\n\n\n12081元/㎡
\n\n\n\n\n小区均价仅供参考,不可作为交易等依据
\n\n\n'
dr_info = re.compile(r'<[^>]+>',re.S) # 去掉标签
get_info= dr_info.sub('',info) # 只包含文字信息,但是
# '本\xa0月\xa0均\xa0价\n\n\n12081元/㎡\n\n\n\n\n小区均价仅供参考,不可作为交易等依据\n\n\n'
result_info =get_info.replace(u'\xa0', '') # replace 可以对字符串进行替换
# '本月均价\n\n\n12081元/㎡\n\n\n\n\n小区均价仅供参考,不可作为交易等依据\n\n\n'
result_info =result_info.replace(u' ', '')
# '本月均价\n\n\n12081元/㎡\n\n\n\n\n小区均价仅供参考,不可作为交易等依据\n\n\n'
result_info = result_info.splitlines() # splitlines 可以按照换行符分割字符串
# ['本月均价', '', '', '12081元/㎡', '', '', '', '', '小区均价仅供参考,不可作为交易等依据', '', '']
result_info = [x.strip() for x in result_info if x.strip()!='']
# ['本月均价', '12081元/㎡', '小区均价仅供参考,不可作为交易等依据']
简单来说selenium是相当于模拟点击网页
在寻找相关元素时推荐使用 find_element_by_xpath
self.driver = webdriver.Chrome(executable_path=r'D:\chromedriver_win32\chromedriver.exe',chrome_options=self.options)
sel = Select(self.driver.find_element_by_xpath('//*[@id="datasetForm:tabView:filesTable:j_id15"]'))
若要模拟点击按钮,则只需要在后面加上click()
self.driver.find_element_by_xpath('//*[@id="datasetForm:tabView:filesTable_head_checkbox"]/span').click()
目前大多网页都具有反爬虫技术,绝大多数是使用检测IP地址的方式,除了放慢爬取的速度以外,还可以使用IP地址的代理池,就是寻找公开的IP地址或者自己购买多个IP,自己维护一个IP池,在爬取的时候在IP池中随机进行选择IP,这样可以有效的避免IP地址被检测出。
还有一下网页在给用户登录的网页中加入一下后缀
old_url :‘https://ccc.ccc.cc.com/aaaaaaaaa/xxxxxxxxxxx/’
在爬取访问时,其实真是的网页会有一个后缀
new_url: '‘https://ccc.ccc.cc.com/aaaaaaaaa/xxxxxxxxxxx/?rfss=1-a5060e33421d163158-0e’
解决办法就是在request.text中寻找转换的信息,通过if进行判断
if r'跳转... ' in r.text:
soup = BeautifulSoup(r.text, 'lxml')
new_url = soup.find(name='a', attrs={'class': 'btn-redir'}).attrs['href']
return new_url
import re
re.search()
re.match()
两个函数都可以使用正则表达式进行匹配
这里推荐一个正则表达式的可视化平台